From ab12fb15f5ca2ef722fcc86180be75c4fcb4b93f Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Sun, 23 Aug 2026 22:11:05 +0300 Subject: [PATCH 01/60] [CALCITE-7736] Replace the Checker Framework with NullAway and JSpecify The Checker Framework verified nullness through a Gradle plugin of its own, a set of `.astub` files that patched the nullness of the JDK and of third-party libraries, and two dedicated CI jobs. NullAway runs as an Error Prone check instead, so it needs no separate plugin and no stub files: it ships nullness models for the JDK and for popular libraries, and JSpecify supplies the annotations. Build: * drop the `org.checkerframework` plugin and its configuration block, and delete the 48 `.astub` files * add `com.uber.nullaway:nullaway` to the `errorprone` configuration and configure it for JSpecify, including the experimental generics support (`JSpecifyExperimental`, `HandleWildcardGenerics`, `JSpecifyJDKModels`, `WarnOnGenericInferenceFailure`) * replace `org.checkerframework:checker-qual` with `org.jspecify:jspecify` * raise Error Prone to 2.50.0 and the Error Prone plugin to 5.1.0, which NullAway requires NullAway is an error in the projects listed in `nullawayProjects` and is off elsewhere, so a nullness problem fails one CI job rather than every test job. CI: * drop the two `CheckerFramework` jobs * fold nullness verification into the `errorprone` job, which moves to JDK 21 because Error Prone 2.43 and later require it This commit only moves the tooling; the source still carries Checker Framework annotations and is migrated by the commits that follow. Co-Authored-By: Claude Opus 5 --- .editorconfig | 3 - .github/workflows/main.yml | 47 +----- bom/build.gradle.kts | 2 +- build.gradle.kts | 136 ++++++++++++------ core/build.gradle.kts | 4 +- druid/build.gradle.kts | 2 +- elasticsearch/build.gradle.kts | 2 +- example/csv/build.gradle.kts | 2 +- example/function/build.gradle.kts | 2 +- file/build.gradle.kts | 2 +- geode/build.gradle.kts | 2 +- gradle.properties | 8 +- kafka/build.gradle.kts | 2 +- linq4j/build.gradle.kts | 5 +- piglet/build.gradle.kts | 2 +- plus/build.gradle.kts | 2 +- settings.gradle.kts | 1 - site/develop/index.md | 49 +++++-- .../config/checkerframework/Collection.astub | 27 ---- .../config/checkerframework/Constructor.astub | 23 --- src/main/config/checkerframework/Field.astub | 25 ---- .../checkerframework/InvocationHandler.astub | 23 --- src/main/config/checkerframework/List.astub | 31 ---- src/main/config/checkerframework/Map.astub | 35 ----- src/main/config/checkerframework/Method.astub | 23 --- .../checkerframework/MethodHandle.astub | 23 --- .../config/checkerframework/Objects.astub | 38 ----- src/main/config/checkerframework/Proxy.astub | 23 --- src/main/config/checkerframework/Set.astub | 27 ---- src/main/config/checkerframework/String.astub | 23 --- src/main/config/checkerframework/URI.astub | 24 ---- .../aggdesigner/Attribute.astub | 25 ---- .../checkerframework/aggdesigner/Table.astub | 23 --- .../avatica/AvaticaFactory.astub | 31 ---- .../avatica/AvaticaPreparedStatement.astub | 28 ---- .../avatica/AvaticaResultMetaData.astub | 26 ---- .../avatica/AvaticaResultSet.astub | 30 ---- .../avatica/AvaticaResultSetMetaData.astub | 30 ---- .../avatica/AvaticaSite.astub | 61 -------- .../avatica/AvaticaStatement.astub | 29 ---- .../avatica/ColumnMetaData.astub | 43 ------ .../avatica/ConnectionConfigImpl.astub | 25 ---- .../avatica/ConnectionProperty.astub | 33 ----- .../checkerframework/avatica/Handler.astub | 27 ---- .../checkerframework/avatica/Meta.astub | 43 ------ .../checkerframework/avatica/MetaImpl.astub | 64 --------- .../avatica/TimeUnitRange.astub | 25 ---- .../commons-dbcp2/BasicDataSource.astub | 29 ---- .../esri-geometry/OperatorBoundary.astub | 23 --- .../OperatorSimpleRelation.astub | 24 ---- .../checkerframework/guava/Function.astub | 30 ---- .../checkerframework/guava/Iterables.astub | 30 ---- .../checkerframework/guava/Ordering.astub | 32 ----- .../checkerframework/guava/Predicate.astub | 29 ---- .../jackson/ObjectMapper.astub | 25 ---- .../jackson/ObjectWriter.astub | 25 ---- .../janino/ClassBodyEvaluator.astub | 23 --- .../janino/IClassBodyEvaluator.astub | 23 --- .../janino/ISimpleCompiler.astub | 23 --- .../janino/JavaSourceClassLoader.astub | 35 ----- .../checkerframework/janino/Scanner.astub | 23 --- .../checkerframework/jdbc/Connection.astub | 23 --- .../jdbc/DatabaseMetaData.astub | 23 --- .../jsonpath/JacksonJsonProvider.astub | 23 --- .../checkerframework/slf4j/Logger.astub | 101 ------------- .../slf4j/MessageFormatter.astub | 23 --- testkit/build.gradle.kts | 2 +- 67 files changed, 152 insertions(+), 1578 deletions(-) delete mode 100644 src/main/config/checkerframework/Collection.astub delete mode 100644 src/main/config/checkerframework/Constructor.astub delete mode 100644 src/main/config/checkerframework/Field.astub delete mode 100644 src/main/config/checkerframework/InvocationHandler.astub delete mode 100644 src/main/config/checkerframework/List.astub delete mode 100644 src/main/config/checkerframework/Map.astub delete mode 100644 src/main/config/checkerframework/Method.astub delete mode 100644 src/main/config/checkerframework/MethodHandle.astub delete mode 100644 src/main/config/checkerframework/Objects.astub delete mode 100644 src/main/config/checkerframework/Proxy.astub delete mode 100644 src/main/config/checkerframework/Set.astub delete mode 100644 src/main/config/checkerframework/String.astub delete mode 100644 src/main/config/checkerframework/URI.astub delete mode 100644 src/main/config/checkerframework/aggdesigner/Attribute.astub delete mode 100644 src/main/config/checkerframework/aggdesigner/Table.astub delete mode 100644 src/main/config/checkerframework/avatica/AvaticaFactory.astub delete mode 100644 src/main/config/checkerframework/avatica/AvaticaPreparedStatement.astub delete mode 100644 src/main/config/checkerframework/avatica/AvaticaResultMetaData.astub delete mode 100644 src/main/config/checkerframework/avatica/AvaticaResultSet.astub delete mode 100644 src/main/config/checkerframework/avatica/AvaticaResultSetMetaData.astub delete mode 100644 src/main/config/checkerframework/avatica/AvaticaSite.astub delete mode 100644 src/main/config/checkerframework/avatica/AvaticaStatement.astub delete mode 100644 src/main/config/checkerframework/avatica/ColumnMetaData.astub delete mode 100644 src/main/config/checkerframework/avatica/ConnectionConfigImpl.astub delete mode 100644 src/main/config/checkerframework/avatica/ConnectionProperty.astub delete mode 100644 src/main/config/checkerframework/avatica/Handler.astub delete mode 100644 src/main/config/checkerframework/avatica/Meta.astub delete mode 100644 src/main/config/checkerframework/avatica/MetaImpl.astub delete mode 100644 src/main/config/checkerframework/avatica/TimeUnitRange.astub delete mode 100644 src/main/config/checkerframework/commons-dbcp2/BasicDataSource.astub delete mode 100644 src/main/config/checkerframework/esri-geometry/OperatorBoundary.astub delete mode 100644 src/main/config/checkerframework/esri-geometry/OperatorSimpleRelation.astub delete mode 100644 src/main/config/checkerframework/guava/Function.astub delete mode 100644 src/main/config/checkerframework/guava/Iterables.astub delete mode 100644 src/main/config/checkerframework/guava/Ordering.astub delete mode 100644 src/main/config/checkerframework/guava/Predicate.astub delete mode 100644 src/main/config/checkerframework/jackson/ObjectMapper.astub delete mode 100644 src/main/config/checkerframework/jackson/ObjectWriter.astub delete mode 100644 src/main/config/checkerframework/janino/ClassBodyEvaluator.astub delete mode 100644 src/main/config/checkerframework/janino/IClassBodyEvaluator.astub delete mode 100644 src/main/config/checkerframework/janino/ISimpleCompiler.astub delete mode 100644 src/main/config/checkerframework/janino/JavaSourceClassLoader.astub delete mode 100644 src/main/config/checkerframework/janino/Scanner.astub delete mode 100644 src/main/config/checkerframework/jdbc/Connection.astub delete mode 100644 src/main/config/checkerframework/jdbc/DatabaseMetaData.astub delete mode 100644 src/main/config/checkerframework/jsonpath/JacksonJsonProvider.astub delete mode 100644 src/main/config/checkerframework/slf4j/Logger.astub delete mode 100644 src/main/config/checkerframework/slf4j/MessageFormatter.astub 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/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..69291c9f3df1 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") + 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,87 @@ 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") + // 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 +924,7 @@ allprojects { if (werror) { options.compilerArgs.add("-Werror") } - if (enableCheckerframework) { + if (enableErrorprone) { options.forkOptions.memoryMaximumSize = "2g" } excludeIntellijGenerated() 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/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/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/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/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/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/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/gradle.properties b/gradle.properties index 7226aaf8b16d..7bf90190cbd9 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.1 # 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/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/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/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/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/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..ccc55352ee85 100644 --- a/site/develop/index.md +++ b/site/develop/index.md @@ -229,29 +229,50 @@ 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. +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>`. -* The Checker Framework verifies code method by method. That means, it can't account for method execution order. +* 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 +280,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/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/guava/Function.astub b/src/main/config/checkerframework/guava/Function.astub deleted file mode 100644 index 76f9d0aea34d..000000000000 --- a/src/main/config/checkerframework/guava/Function.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 com.google.common.base; - -import org.checkerframework.checker.nullness.qual.*; - -/** - * 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 - */ -public interface Function { - T apply(F input); -} diff --git a/src/main/config/checkerframework/guava/Iterables.astub b/src/main/config/checkerframework/guava/Iterables.astub deleted file mode 100644 index db302664618d..000000000000 --- a/src/main/config/checkerframework/guava/Iterables.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 com.google.common.collect; - -import org.checkerframework.checker.nullness.qual.*; - -/** - * 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 - */ -public class Iterables { - public static T[] toArray(Iterable iterable, Class type); -} diff --git a/src/main/config/checkerframework/guava/Ordering.astub b/src/main/config/checkerframework/guava/Ordering.astub deleted file mode 100644 index 820a66856bb5..000000000000 --- a/src/main/config/checkerframework/guava/Ordering.astub +++ /dev/null @@ -1,32 +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.google.common.collect; - -import org.checkerframework.checker.nullness.qual.*; - -/** - * 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 - */ -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); -} diff --git a/src/main/config/checkerframework/guava/Predicate.astub b/src/main/config/checkerframework/guava/Predicate.astub deleted file mode 100644 index 577f270e38b5..000000000000 --- a/src/main/config/checkerframework/guava/Predicate.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 com.google.common.base; - -import org.checkerframework.checker.nullness.qual.*; - -/** - * Guava has {@code Nullable} argument and return value by default. - * Checkerframework cna infer nullability from the actual generic types. - * - * @param argument type - */ -public interface Predicate { - boolean apply(T input); -} 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")) From 78c92ab7b9aef0830dc2d2c955028632f84efd0c Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Sun, 30 Aug 2026 10:43:11 +0300 Subject: [PATCH 02/60] [CALCITE-7736] Add the JSpecify Java 8 transformation workaround JSpecify targets @NullMarked at a module as well as a package, and javac 8 knows no ElementType.MODULE, so every compilation that reads the annotation warns "unknown enum constant ElementType.MODULE". The warning has no lint category and -Werror turns it into a failure, and JSpecify knows no way around it (https://github.com/jspecify/jspecify/wiki/version-compatibility). An artifact transform rewrites that one constant in the annotation's @Target before the jar reaches the compile classpath, so the migration that follows compiles under Java 8 as it does under 21. Co-Authored-By: Codex GPT 5.6-Terra Co-Authored-By: Claude Opus 5 --- build.gradle.kts | 89 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index 69291c9f3df1..9b9e3dfb3be2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,9 +25,24 @@ import com.github.vlsi.gradle.properties.dsl.props import com.github.vlsi.gradle.release.RepositoryType import de.thetaphi.forbiddenapis.gradle.CheckForbiddenApis import de.thetaphi.forbiddenapis.gradle.CheckForbiddenApisExtension +import java.util.zip.ZipEntry +import java.util.zip.ZipFile +import java.util.zip.ZipInputStream +import java.util.zip.ZipOutputStream import net.ltgt.gradle.errorprone.errorprone import org.apache.calcite.buildtools.asmchecker.AsmCheckerTask import org.apache.calcite.buildtools.buildext.dsl.ParenthesisBalancer +import org.gradle.api.artifacts.transform.CacheableTransform +import org.gradle.api.artifacts.transform.InputArtifact +import org.gradle.api.artifacts.transform.TransformAction +import org.gradle.api.artifacts.transform.TransformOutputs +import org.gradle.api.artifacts.transform.TransformParameters +import org.gradle.api.artifacts.type.ArtifactTypeDefinition +import org.gradle.api.attributes.Attribute +import org.gradle.api.file.FileSystemLocation +import org.gradle.api.provider.Provider +import org.gradle.api.tasks.PathSensitive +import org.gradle.api.tasks.PathSensitivity import org.gradle.api.tasks.testing.logging.TestExceptionFormat plugins { @@ -73,6 +88,62 @@ tasks.wrapper { distributionType = Wrapper.DistributionType.BIN } +val jspecifyJava8Compatible = + Attribute.of("org.apache.calcite.jspecify-java8-compatible", Boolean::class.javaObjectType) + +/** Removes the Java 9-only MODULE target from JSpecify's @NullMarked annotation. Workaround for https://github.com/jspecify/jspecify/issues/795 */ +@CacheableTransform +abstract class JSpecifyJava8Transform : TransformAction { + @get:InputArtifact + @get:PathSensitive(PathSensitivity.NAME_ONLY) + abstract val inputArtifact: Provider + + override fun transform(outputs: TransformOutputs) { + val input = inputArtifact.get().asFile + if (input.length() > 64_000L || + !ZipFile(input).use { it.getEntry("org/jspecify/annotations/NullMarked.class") != null }) { + outputs.file(input) + return + } + val output = outputs.file(input.name) + ZipInputStream(input.inputStream().buffered()).use { source -> + ZipOutputStream(output.outputStream().buffered()).use { destination -> + while (true) { + val entry = source.nextEntry ?: break + destination.putNextEntry(ZipEntry(entry.name)) + if (!entry.isDirectory) { + val bytes = source.readBytes() + destination.write( + if (entry.name == "org/jspecify/annotations/NullMarked.class") { + bytes.replaceModuleTarget() + } else bytes + ) + } + destination.closeEntry() + source.closeEntry() + } + } + } + } + + private fun ByteArray.replaceModuleTarget(): ByteArray { + fun utf8Entry(value: String): ByteArray { + val bytes = value.toByteArray(Charsets.US_ASCII) + return byteArrayOf(1, 0, bytes.size.toByte()) + bytes + } + + val module = utf8Entry("MODULE") + val method = "METHOD".toByteArray(Charsets.US_ASCII) + val signature = utf8Entry("Ljava/lang/annotation/ElementType;") + module + val offset = (0..(size - signature.size)).singleOrNull { index -> + signature.indices.all { offset -> this[index + offset] == signature[offset] } + } ?: return this + return copyOf().also { + method.copyInto(it, offset + signature.size - method.size) + } + } +} + fun reportsForHumans() = !(System.getenv()["CI"]?.toBoolean() ?: false) val lastEditYear by extra(lastEditYear()) @@ -584,6 +655,24 @@ allprojects { } plugins.withType { + configurations.configureEach { + if (isCanBeResolved && !isCanBeConsumed) { + attributes.attribute(jspecifyJava8Compatible, true) + } + } + dependencies { + attributesSchema { + attribute(jspecifyJava8Compatible) + } + artifactTypes.getByName(ArtifactTypeDefinition.JAR_TYPE) + .attributes.attribute(jspecifyJava8Compatible, false) + registerTransform(JSpecifyJava8Transform::class) { + from.attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.JAR_TYPE) + .attribute(jspecifyJava8Compatible, false) + to.attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.JAR_TYPE) + .attribute(jspecifyJava8Compatible, true) + } + } configure { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 From 4e59988fd1853e15b59f0a8fb0494a17c0a84058 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Sun, 30 Aug 2026 10:49:42 +0300 Subject: [PATCH 03/60] [CALCITE-7736] Move the Checker Framework annotations to JSpecify `org.checkerframework.checker.nullness.qual.Nullable` becomes `org.jspecify.annotations.Nullable`, and the matching `NonNull` likewise. Both annotations are `TYPE_USE`, so every existing position stays valid and no annotation moves. Autostyle rewrites either annotation to its JSpecify counterpart from now on, alongside the rule that already rewrote the jsr305 ones. `@DefaultQualifier(NonNull, {FIELD, PARAMETER, RETURN})` is how the Checker Framework said "types are non-null unless annotated". JSpecify says it with `@NullMarked`, which covers every type position rather than three of them. Only `calcite-linq4j` and `calcite-core` are verified, so only their main packages get the annotation: `@NullMarked` claims that a package is fully annotated, and in an unverified module nothing backs that claim. JSpecify defines nothing beyond those three, so the rest of the Checker Framework annotations move to `org.apache.calcite.linq4j.annotations`, which declares @Contract, @MonotonicNonNull, @RequiresNonNull, @EnsuresNonNull and @EnsuresNonNullIf. NullAway matches these by the last component of their name rather than by their package, so Calcite declares its own and takes no dependency on the checker. The three steps land together because the ones in between do not compile: the first leaves `@PolyNull` and its siblings importing a dependency the build no longer has. Co-Authored-By: Claude Opus 5 --- .../calcite/adapter/arrow/ArrowProject.java | 2 +- .../calcite/adapter/arrow/ArrowRel.java | 2 +- .../calcite/adapter/arrow/ArrowRules.java | 2 +- .../calcite/adapter/arrow/ArrowSchema.java | 2 +- .../calcite/adapter/arrow/ArrowTable.java | 2 +- .../adapter/arrow/ArrowTranslator.java | 2 +- .../calcite/adapter/arrow/ConditionToken.java | 2 +- .../sql/babel/SqlBabelCreateTable.java | 4 +- .../apache/calcite/test/BabelParserTest.java | 2 +- .../apache/calcite/test/BabelQuidemTest.java | 2 +- .../org/apache/calcite/test/package-info.java | 7 - .../cassandra/CassandraEnumerator.java | 2 +- .../adapter/cassandra/CassandraFilter.java | 2 +- .../adapter/cassandra/CassandraLimit.java | 2 +- .../adapter/cassandra/CassandraProject.java | 2 +- .../adapter/cassandra/CassandraRel.java | 2 +- .../adapter/cassandra/CassandraRules.java | 2 +- .../adapter/cassandra/CassandraSort.java | 2 +- .../adapter/cassandra/CassandraTable.java | 2 +- .../adapter/cassandra/CassandraTableScan.java | 2 +- .../CassandraToEnumerableConverter.java | 2 +- .../java/org/apache/calcite/DataContext.java | 2 +- .../java/org/apache/calcite/DataContexts.java | 2 +- .../calcite/adapter/clone/ArrayTable.java | 4 +- .../calcite/adapter/clone/CloneSchema.java | 2 +- .../calcite/adapter/clone/ColumnLoader.java | 8 +- .../calcite/adapter/clone/package-info.java | 3 + .../adapter/enumerable/AggAddContext.java | 2 +- .../adapter/enumerable/AggImpState.java | 3 +- .../adapter/enumerable/AggResultContext.java | 2 +- .../calcite/adapter/enumerable/EnumUtils.java | 2 +- .../enumerable/EnumerableAggregate.java | 2 +- .../enumerable/EnumerableAggregateBase.java | 2 +- .../enumerable/EnumerableAggregateRule.java | 2 +- .../enumerable/EnumerableAsofJoin.java | 2 +- .../EnumerableBatchNestedLoopJoin.java | 2 +- .../enumerable/EnumerableBindable.java | 2 +- .../adapter/enumerable/EnumerableCalc.java | 2 +- .../EnumerableConditionalCorrelate.java | 2 +- .../enumerable/EnumerableCorrelate.java | 2 +- .../adapter/enumerable/EnumerableFilter.java | 2 +- .../enumerable/EnumerableHashJoin.java | 2 +- .../enumerable/EnumerableInterpretable.java | 2 +- .../enumerable/EnumerableInterpreter.java | 2 +- .../adapter/enumerable/EnumerableLimit.java | 2 +- .../enumerable/EnumerableLimitSort.java | 2 +- .../adapter/enumerable/EnumerableMatch.java | 2 +- .../enumerable/EnumerableMergeJoin.java | 2 +- .../enumerable/EnumerableMergeJoinRule.java | 2 +- .../enumerable/EnumerableNestedLoopJoin.java | 2 +- .../adapter/enumerable/EnumerableProject.java | 2 +- .../adapter/enumerable/EnumerableRel.java | 2 +- .../enumerable/EnumerableRelFactories.java | 2 +- .../enumerable/EnumerableRelImplementor.java | 2 +- .../enumerable/EnumerableRepeatUnion.java | 2 +- .../adapter/enumerable/EnumerableSort.java | 2 +- .../enumerable/EnumerableSortRule.java | 2 +- .../enumerable/EnumerableSortedAggregate.java | 2 +- .../EnumerableSortedAggregateRule.java | 2 +- .../EnumerableTableFunctionScan.java | 2 +- .../enumerable/EnumerableTableModify.java | 2 +- .../enumerable/EnumerableTableModifyRule.java | 2 +- .../enumerable/EnumerableTableScan.java | 2 +- .../enumerable/EnumerableTableScanRule.java | 2 +- .../enumerable/EnumerableTraitsUtils.java | 2 +- .../adapter/enumerable/EnumerableValues.java | 2 +- .../adapter/enumerable/EnumerableWindow.java | 4 +- .../adapter/enumerable/JavaRowFormat.java | 2 +- .../enumerable/NestedBlockBuilderImpl.java | 2 +- .../calcite/adapter/enumerable/PhysType.java | 2 +- .../adapter/enumerable/PhysTypeImpl.java | 2 +- .../adapter/enumerable/RexImpTable.java | 4 +- .../enumerable/RexImplementorTable.java | 2 +- .../enumerable/RexImplementorTables.java | 2 +- .../enumerable/RexToLixTranslator.java | 2 +- .../enumerable/impl/AggResultContextImpl.java | 2 +- .../adapter/enumerable/impl/package-info.java | 3 + .../adapter/enumerable/package-info.java | 3 + .../adapter/java/ReflectiveSchema.java | 4 +- .../calcite/adapter/java/package-info.java | 3 + .../calcite/adapter/jdbc/JdbcBaseSchema.java | 2 +- .../adapter/jdbc/JdbcCatalogSchema.java | 6 +- .../jdbc/JdbcCorrelationDataContext.java | 2 +- .../calcite/adapter/jdbc/JdbcRules.java | 2 +- .../calcite/adapter/jdbc/JdbcSchema.java | 4 +- .../calcite/adapter/jdbc/JdbcTable.java | 6 +- .../jdbc/JdbcToEnumerableConverter.java | 2 +- .../jdbc/JdbcToEnumerableConverterRule.java | 2 +- .../calcite/adapter/jdbc/JdbcUtils.java | 2 +- .../calcite/adapter/jdbc/package-info.java | 3 + .../apache/calcite/adapter/package-info.java | 8 +- .../config/CalciteConnectionConfig.java | 27 ++- .../config/CalciteConnectionConfigImpl.java | 27 ++- .../config/CalciteConnectionProperty.java | 2 +- .../calcite/config/CalciteSystemProperty.java | 2 +- .../apache/calcite/config/package-info.java | 8 +- .../calcite/interpreter/AggregateNode.java | 4 +- .../interpreter/BindableConvention.java | 2 +- .../apache/calcite/interpreter/Bindables.java | 2 +- .../calcite/interpreter/CollectNode.java | 2 +- .../apache/calcite/interpreter/Compiler.java | 2 +- .../apache/calcite/interpreter/Context.java | 6 +- .../interpreter/InterpretableConverter.java | 2 +- .../calcite/interpreter/InterpretableRel.java | 2 +- .../calcite/interpreter/Interpreter.java | 9 +- .../calcite/interpreter/Interpreters.java | 2 +- .../apache/calcite/interpreter/JoinNode.java | 2 +- .../org/apache/calcite/interpreter/Nodes.java | 4 +- .../NoneToBindableConverterRule.java | 2 +- .../org/apache/calcite/interpreter/Row.java | 2 +- .../apache/calcite/interpreter/Scalar.java | 2 +- .../apache/calcite/interpreter/SortNode.java | 2 +- .../apache/calcite/interpreter/Source.java | 2 +- .../interpreter/TableFunctionScanNode.java | 2 +- .../calcite/interpreter/TableScanNode.java | 2 +- .../calcite/interpreter/package-info.java | 8 +- .../calcite/jdbc/CachingCalciteSchema.java | 4 +- .../calcite/jdbc/CalciteConnection.java | 2 +- .../calcite/jdbc/CalciteConnectionImpl.java | 2 +- .../apache/calcite/jdbc/CalciteFactory.java | 2 +- .../calcite/jdbc/CalciteJdbc41Factory.java | 2 +- .../jdbc/CalciteMetaColumnFactory.java | 2 +- .../jdbc/CalciteMetaColumnFactoryImpl.java | 2 +- .../apache/calcite/jdbc/CalciteMetaImpl.java | 2 +- .../apache/calcite/jdbc/CalcitePrepare.java | 2 +- .../jdbc/CalcitePreparedStatement.java | 2 +- .../apache/calcite/jdbc/CalciteSchema.java | 4 +- .../apache/calcite/jdbc/CalciteStatement.java | 2 +- .../java/org/apache/calcite/jdbc/Driver.java | 2 +- .../apache/calcite/jdbc/JavaCollation.java | 4 +- .../apache/calcite/jdbc/JavaRecordType.java | 2 +- .../calcite/jdbc/JavaTypeFactoryImpl.java | 2 +- .../calcite/jdbc/SimpleCalciteSchema.java | 2 +- .../org/apache/calcite/jdbc/package-info.java | 8 +- .../apache/calcite/materialize/Lattice.java | 10 +- .../calcite/materialize/LatticeNode.java | 7 +- .../calcite/materialize/LatticeRootNode.java | 2 +- .../calcite/materialize/LatticeSpace.java | 6 +- .../calcite/materialize/LatticeSuggester.java | 4 +- .../calcite/materialize/LatticeTable.java | 2 +- .../materialize/MaterializationActor.java | 2 +- .../materialize/MaterializationKey.java | 2 +- .../materialize/MaterializationService.java | 2 +- .../calcite/materialize/MutableNode.java | 4 +- .../org/apache/calcite/materialize/Path.java | 2 +- .../SqlLatticeStatisticProvider.java | 2 +- .../org/apache/calcite/materialize/Step.java | 10 +- .../apache/calcite/materialize/TileKey.java | 2 +- .../calcite/materialize/TileSuggester.java | 2 +- .../calcite/materialize/package-info.java | 8 +- .../apache/calcite/model/ClassNameFilter.java | 2 +- .../calcite/model/JsonCustomSchema.java | 2 +- .../apache/calcite/model/JsonCustomTable.java | 2 +- .../apache/calcite/model/JsonFunction.java | 2 +- .../apache/calcite/model/JsonJdbcSchema.java | 2 +- .../org/apache/calcite/model/JsonLattice.java | 2 +- .../apache/calcite/model/JsonMapSchema.java | 2 +- .../calcite/model/JsonMaterialization.java | 2 +- .../org/apache/calcite/model/JsonMeasure.java | 2 +- .../org/apache/calcite/model/JsonRoot.java | 2 +- .../org/apache/calcite/model/JsonSchema.java | 2 +- .../org/apache/calcite/model/JsonStream.java | 2 +- .../org/apache/calcite/model/JsonTable.java | 2 +- .../org/apache/calcite/model/JsonTile.java | 2 +- .../org/apache/calcite/model/JsonType.java | 2 +- .../org/apache/calcite/model/JsonView.java | 2 +- .../apache/calcite/model/ModelHandler.java | 4 +- .../apache/calcite/model/package-info.java | 8 +- .../java/org/apache/calcite/package-info.java | 3 + .../calcite/plan/AbstractRelOptPlanner.java | 8 +- .../org/apache/calcite/plan/Contexts.java | 8 +- .../org/apache/calcite/plan/Convention.java | 2 +- .../calcite/plan/ConventionTraitDef.java | 6 +- .../calcite/plan/RelCompositeTrait.java | 2 +- .../calcite/plan/RelOptAbstractTable.java | 4 +- .../apache/calcite/plan/RelOptCluster.java | 7 +- .../apache/calcite/plan/RelOptCostImpl.java | 2 +- .../apache/calcite/plan/RelOptLattice.java | 2 +- .../apache/calcite/plan/RelOptListener.java | 2 +- .../calcite/plan/RelOptMaterialization.java | 2 +- .../apache/calcite/plan/RelOptPlanner.java | 2 +- .../calcite/plan/RelOptPredicateList.java | 2 +- .../org/apache/calcite/plan/RelOptQuery.java | 2 +- .../org/apache/calcite/plan/RelOptRule.java | 5 +- .../apache/calcite/plan/RelOptRuleCall.java | 2 +- .../calcite/plan/RelOptRuleOperand.java | 17 +- .../org/apache/calcite/plan/RelOptSchema.java | 2 +- .../plan/RelOptSchemaWithSampling.java | 2 +- .../org/apache/calcite/plan/RelOptTable.java | 2 +- .../org/apache/calcite/plan/RelOptUtil.java | 18 +- .../java/org/apache/calcite/plan/RelRule.java | 4 +- .../org/apache/calcite/plan/RelTrait.java | 2 +- .../org/apache/calcite/plan/RelTraitDef.java | 2 +- .../plan/RelTraitPropagationVisitor.java | 2 +- .../org/apache/calcite/plan/RelTraitSet.java | 5 +- .../calcite/plan/RexImplicationChecker.java | 7 +- .../apache/calcite/plan/SpoolRelOptTable.java | 2 +- .../calcite/plan/SubstitutionVisitor.java | 4 +- .../apache/calcite/plan/TableAccessMap.java | 4 +- .../apache/calcite/plan/ViewExpanders.java | 2 +- .../calcite/plan/VisitorDataContext.java | 2 +- .../calcite/plan/hep/HepInstruction.java | 4 +- .../apache/calcite/plan/hep/HepPlanner.java | 2 +- .../apache/calcite/plan/hep/HepProgram.java | 2 +- .../plan/hep/HepRelMetadataProvider.java | 4 +- .../apache/calcite/plan/hep/HepRelVertex.java | 2 +- .../apache/calcite/plan/hep/HepRuleCall.java | 2 +- .../apache/calcite/plan/hep/package-info.java | 3 + .../org/apache/calcite/plan/package-info.java | 8 +- .../visualizer/InputExcludedRelWriter.java | 2 +- .../plan/visualizer/NodeUpdateHelper.java | 2 +- .../plan/visualizer/RuleMatchVisualizer.java | 2 +- .../calcite/plan/visualizer/package-info.java | 3 + .../plan/volcano/AbstractConverter.java | 2 +- .../apache/calcite/plan/volcano/Dumpers.java | 2 +- .../plan/volcano/IterativeRuleQueue.java | 2 +- .../apache/calcite/plan/volcano/RelSet.java | 4 +- .../calcite/plan/volcano/RelSubset.java | 8 +- .../plan/volcano/TopDownRuleDriver.java | 2 +- .../plan/volcano/TopDownRuleQueue.java | 2 +- .../calcite/plan/volcano/VolcanoCost.java | 2 +- .../calcite/plan/volcano/VolcanoPlanner.java | 15 +- .../volcano/VolcanoRelMetadataProvider.java | 4 +- .../calcite/plan/volcano/VolcanoRuleCall.java | 2 +- .../plan/volcano/VolcanoRuleMatch.java | 2 +- .../calcite/plan/volcano/package-info.java | 3 + .../calcite/prepare/CalciteCatalogReader.java | 4 +- .../calcite/prepare/CalcitePrepareImpl.java | 2 +- .../apache/calcite/prepare/PlannerImpl.java | 6 +- .../org/apache/calcite/prepare/Prepare.java | 4 +- .../calcite/prepare/QueryableRelBuilder.java | 7 +- .../calcite/prepare/RelOptTableImpl.java | 8 +- .../apache/calcite/prepare/package-info.java | 8 +- .../org/apache/calcite/profile/Profiler.java | 2 +- .../apache/calcite/profile/ProfilerImpl.java | 2 +- .../calcite/profile/SimpleProfiler.java | 6 +- .../apache/calcite/profile/package-info.java | 8 +- .../apache/calcite/rel/AbstractRelNode.java | 12 +- .../org/apache/calcite/rel/PhysicalNode.java | 2 +- .../apache/calcite/rel/RelCollationImpl.java | 2 +- .../calcite/rel/RelCollationTraitDef.java | 2 +- .../RelCommonExpressionBasicSuggester.java | 2 +- .../rel/RelCommonExpressionSuggester.java | 2 +- .../calcite/rel/RelDistributionTraitDef.java | 2 +- .../apache/calcite/rel/RelDistributions.java | 2 +- .../apache/calcite/rel/RelFieldCollation.java | 2 +- .../java/org/apache/calcite/rel/RelInput.java | 2 +- .../java/org/apache/calcite/rel/RelNode.java | 8 +- .../java/org/apache/calcite/rel/RelNodes.java | 2 +- .../calcite/rel/RelValidityChecker.java | 2 +- .../org/apache/calcite/rel/RelVisitor.java | 2 +- .../org/apache/calcite/rel/RelWriter.java | 2 +- .../apache/calcite/rel/convert/Converter.java | 2 +- .../calcite/rel/convert/ConverterImpl.java | 2 +- .../calcite/rel/convert/ConverterRule.java | 2 +- .../rel/convert/TraitMatchingRule.java | 2 +- .../calcite/rel/convert/package-info.java | 3 + .../apache/calcite/rel/core/Aggregate.java | 4 +- .../calcite/rel/core/AggregateCall.java | 2 +- .../org/apache/calcite/rel/core/Calc.java | 4 +- .../org/apache/calcite/rel/core/Collect.java | 6 +- .../apache/calcite/rel/core/Correlate.java | 4 +- .../calcite/rel/core/CorrelationId.java | 2 +- .../org/apache/calcite/rel/core/Exchange.java | 2 +- .../org/apache/calcite/rel/core/Filter.java | 6 +- .../org/apache/calcite/rel/core/Join.java | 4 +- .../org/apache/calcite/rel/core/Match.java | 2 +- .../org/apache/calcite/rel/core/Project.java | 6 +- .../apache/calcite/rel/core/RelFactories.java | 2 +- .../apache/calcite/rel/core/RepeatUnion.java | 2 +- .../org/apache/calcite/rel/core/Snapshot.java | 6 +- .../org/apache/calcite/rel/core/Sort.java | 2 +- .../calcite/rel/core/TableFunctionScan.java | 2 +- .../apache/calcite/rel/core/TableModify.java | 4 +- .../apache/calcite/rel/core/TableScan.java | 2 +- .../apache/calcite/rel/core/Uncollect.java | 2 +- .../org/apache/calcite/rel/core/Values.java | 6 +- .../org/apache/calcite/rel/core/Window.java | 7 +- .../apache/calcite/rel/core/package-info.java | 3 + .../calcite/rel/externalize/RelDotWriter.java | 2 +- .../calcite/rel/externalize/RelEnumTypes.java | 4 +- .../calcite/rel/externalize/RelJson.java | 9 +- .../rel/externalize/RelJsonReader.java | 2 +- .../rel/externalize/RelJsonWriter.java | 2 +- .../rel/externalize/RelWriterImpl.java | 2 +- .../calcite/rel/externalize/RelXmlWriter.java | 2 +- .../calcite/rel/externalize/package-info.java | 3 + .../apache/calcite/rel/hint/HintStrategy.java | 2 +- .../calcite/rel/hint/HintStrategyTable.java | 2 +- .../org/apache/calcite/rel/hint/RelHint.java | 2 +- .../apache/calcite/rel/hint/package-info.java | 3 + .../calcite/rel/logical/LogicalAggregate.java | 2 +- .../calcite/rel/logical/LogicalAsofJoin.java | 2 +- .../calcite/rel/logical/LogicalFilter.java | 2 +- .../calcite/rel/logical/LogicalJoin.java | 2 +- .../calcite/rel/logical/LogicalMatch.java | 2 +- .../calcite/rel/logical/LogicalProject.java | 2 +- .../rel/logical/LogicalRepeatUnion.java | 2 +- .../calcite/rel/logical/LogicalSort.java | 2 +- .../rel/logical/LogicalTableFunctionScan.java | 2 +- .../rel/logical/LogicalTableModify.java | 2 +- .../calcite/rel/logical/LogicalWindow.java | 2 +- .../calcite/rel/logical/package-info.java | 3 + .../calcite/rel/metadata/BuiltInMetadata.java | 2 +- .../metadata/CachingRelMetadataProvider.java | 4 +- .../metadata/ChainedRelMetadataProvider.java | 6 +- .../metadata/JaninoRelMetadataProvider.java | 4 +- .../calcite/rel/metadata/MetadataFactory.java | 4 +- .../rel/metadata/MetadataFactoryImpl.java | 4 +- .../calcite/rel/metadata/NullSentinel.java | 2 +- .../ReflectiveRelMetadataProvider.java | 6 +- .../calcite/rel/metadata/RelColumnOrigin.java | 2 +- .../rel/metadata/RelMdAllPredicates.java | 2 +- .../calcite/rel/metadata/RelMdCollation.java | 2 +- .../rel/metadata/RelMdColumnOrigins.java | 7 +- .../rel/metadata/RelMdColumnUniqueness.java | 2 +- .../rel/metadata/RelMdDistinctRowCount.java | 2 +- .../rel/metadata/RelMdDistribution.java | 2 +- .../rel/metadata/RelMdExplainVisibility.java | 2 +- .../rel/metadata/RelMdExpressionLineage.java | 5 +- .../metadata/RelMdFunctionalDependency.java | 2 +- .../rel/metadata/RelMdLowerBoundCost.java | 2 +- .../rel/metadata/RelMdMaxRowCount.java | 2 +- .../calcite/rel/metadata/RelMdMeasure.java | 2 +- .../calcite/rel/metadata/RelMdMemory.java | 2 +- .../rel/metadata/RelMdMinRowCount.java | 2 +- .../calcite/rel/metadata/RelMdNodeTypes.java | 2 +- .../metadata/RelMdPercentageOriginalRows.java | 9 +- .../rel/metadata/RelMdPopulationSize.java | 2 +- .../calcite/rel/metadata/RelMdPredicates.java | 2 +- .../calcite/rel/metadata/RelMdRowCount.java | 2 +- .../rel/metadata/RelMdSelectivity.java | 2 +- .../calcite/rel/metadata/RelMdSize.java | 2 +- .../rel/metadata/RelMdTableReferences.java | 2 +- .../calcite/rel/metadata/RelMdUniqueKeys.java | 2 +- .../calcite/rel/metadata/RelMdUtil.java | 15 +- .../rel/metadata/RelMetadataProvider.java | 4 +- .../rel/metadata/RelMetadataQuery.java | 2 +- .../rel/metadata/RelMetadataQueryBase.java | 2 +- .../calcite/rel/metadata/UnboundMetadata.java | 2 +- .../metadata/janino/DispatchGenerator.java | 2 +- .../RelMetadataHandlerGeneratorUtil.java | 2 +- .../rel/metadata/janino/package-info.java | 8 +- .../calcite/rel/metadata/package-info.java | 3 + .../calcite/rel/mutable/MutableAggregate.java | 2 +- .../calcite/rel/mutable/MutableBiRel.java | 2 +- .../calcite/rel/mutable/MutableCalc.java | 2 +- .../calcite/rel/mutable/MutableCollect.java | 2 +- .../calcite/rel/mutable/MutableCorrelate.java | 2 +- .../calcite/rel/mutable/MutableExchange.java | 2 +- .../calcite/rel/mutable/MutableFilter.java | 2 +- .../calcite/rel/mutable/MutableJoin.java | 2 +- .../calcite/rel/mutable/MutableMatch.java | 2 +- .../calcite/rel/mutable/MutableMultiRel.java | 2 +- .../calcite/rel/mutable/MutableProject.java | 2 +- .../calcite/rel/mutable/MutableRel.java | 2 +- .../rel/mutable/MutableRelVisitor.java | 2 +- .../calcite/rel/mutable/MutableRels.java | 2 +- .../calcite/rel/mutable/MutableSample.java | 2 +- .../calcite/rel/mutable/MutableScan.java | 2 +- .../calcite/rel/mutable/MutableSetOp.java | 2 +- .../calcite/rel/mutable/MutableSingleRel.java | 2 +- .../calcite/rel/mutable/MutableSort.java | 2 +- .../rel/mutable/MutableTableFunctionScan.java | 2 +- .../rel/mutable/MutableTableModify.java | 2 +- .../calcite/rel/mutable/MutableUncollect.java | 2 +- .../calcite/rel/mutable/MutableValues.java | 2 +- .../calcite/rel/mutable/MutableWindow.java | 2 +- .../calcite/rel/mutable/package-info.java | 3 + .../org/apache/calcite/rel/package-info.java | 8 +- .../rel/rel2sql/RelToSqlConverter.java | 4 +- .../calcite/rel/rel2sql/SqlImplementor.java | 12 +- .../calcite/rel/rel2sql/package-info.java | 3 + .../rel/rules/AggregateCaseToFilterRule.java | 2 +- ...AggregateExpandDistinctAggregatesRule.java | 4 +- .../AggregateExpandWithinDistinctRule.java | 2 +- .../rel/rules/AggregateJoinTransposeRule.java | 2 +- .../rel/rules/AggregateProjectMergeRule.java | 2 +- ...gregateReduceFunctionsOnGroupKeysRule.java | 2 +- .../rules/AggregateReduceFunctionsRule.java | 2 +- .../rel/rules/AggregateRemoveRule.java | 2 +- .../rel/rules/AggregateStarTableRule.java | 2 +- .../calcite/rel/rules/CalcRelSplitter.java | 4 +- .../calcite/rel/rules/CoerceInputsRule.java | 2 +- .../calcite/rel/rules/DateRangeRules.java | 2 +- .../org/apache/calcite/rel/rules/DpHyp.java | 2 +- .../rules/ExpandDisjunctionForTableRule.java | 2 +- .../calcite/rel/rules/FilterJoinRule.java | 2 +- .../rel/rules/FilterMultiJoinMergeRule.java | 2 +- .../apache/calcite/rel/rules/HyperGraph.java | 2 +- .../calcite/rel/rules/JoinCommuteRule.java | 2 +- .../rel/rules/JoinProjectTransposeRule.java | 2 +- .../rel/rules/JoinToMultiJoinRule.java | 2 +- .../calcite/rel/rules/LoptJoinTree.java | 13 +- .../calcite/rel/rules/LoptMultiJoin.java | 18 +- .../rel/rules/LoptOptimizeJoinRule.java | 9 +- .../rel/rules/LoptSemiJoinOptimizer.java | 2 +- .../apache/calcite/rel/rules/MultiJoin.java | 2 +- .../rel/rules/MultiJoinOptimizeBushyRule.java | 2 +- .../rel/rules/OuterJoinToAntiJoinRule.java | 2 +- .../rel/rules/ProjectFilterTransposeRule.java | 2 +- .../calcite/rel/rules/PushProjector.java | 2 +- .../calcite/rel/rules/ReduceDecimalsRule.java | 4 +- .../rel/rules/ReduceExpressionsRule.java | 2 +- .../calcite/rel/rules/SemiJoinRule.java | 2 +- .../calcite/rel/rules/SetOpToFilterRule.java | 2 +- .../rules/SingleValuesOptimizationRules.java | 2 +- .../rel/rules/SortJoinTransposeRule.java | 2 +- .../calcite/rel/rules/SpatialRules.java | 2 +- .../calcite/rel/rules/ValuesReduceRule.java | 2 +- .../MaterializedViewAggregateRule.java | 2 +- .../materialize/MaterializedViewJoinRule.java | 2 +- .../materialize/MaterializedViewRule.java | 2 +- .../rel/rules/materialize/package-info.java | 3 + .../calcite/rel/rules/package-info.java | 3 + .../calcite/rel/stream/package-info.java | 3 + .../rel/type/DelegatingTypeSystem.java | 2 +- .../rel/type/DynamicRecordTypeImpl.java | 4 +- .../apache/calcite/rel/type/RelCrossType.java | 2 +- .../apache/calcite/rel/type/RelDataType.java | 10 +- .../calcite/rel/type/RelDataTypeFactory.java | 2 +- .../rel/type/RelDataTypeFactoryImpl.java | 4 +- .../calcite/rel/type/RelDataTypeField.java | 4 +- .../rel/type/RelDataTypeFieldImpl.java | 2 +- .../calcite/rel/type/RelDataTypeImpl.java | 7 +- .../calcite/rel/type/RelDataTypeSystem.java | 2 +- .../rel/type/RelDataTypeSystemImpl.java | 2 +- .../calcite/rel/type/RelRecordType.java | 2 +- .../type/SingleColumnAliasRelDataType.java | 2 +- .../apache/calcite/rel/type/TimeFrame.java | 2 +- .../apache/calcite/rel/type/TimeFrameSet.java | 2 +- .../apache/calcite/rel/type/TimeFrames.java | 2 +- .../apache/calcite/rel/type/package-info.java | 3 + .../org/apache/calcite/rex/LogicVisitor.java | 2 +- .../apache/calcite/rex/RexBiVisitorImpl.java | 4 +- .../org/apache/calcite/rex/RexBuilder.java | 7 +- .../java/org/apache/calcite/rex/RexCall.java | 18 +- .../apache/calcite/rex/RexCallBinding.java | 2 +- .../org/apache/calcite/rex/RexChecker.java | 2 +- .../apache/calcite/rex/RexCorrelVariable.java | 2 +- .../apache/calcite/rex/RexDynamicParam.java | 2 +- .../org/apache/calcite/rex/RexExecutable.java | 2 +- .../apache/calcite/rex/RexExecutorImpl.java | 2 +- .../apache/calcite/rex/RexFieldAccess.java | 2 +- .../org/apache/calcite/rex/RexInputRef.java | 2 +- .../apache/calcite/rex/RexInterpreter.java | 2 +- .../org/apache/calcite/rex/RexLambda.java | 2 +- .../org/apache/calcite/rex/RexLambdaRef.java | 2 +- .../org/apache/calcite/rex/RexLiteral.java | 16 +- .../org/apache/calcite/rex/RexLocalRef.java | 2 +- .../apache/calcite/rex/RexMultisetUtil.java | 2 +- .../java/org/apache/calcite/rex/RexNode.java | 4 +- .../calcite/rex/RexNodeAndFieldIndex.java | 2 +- .../java/org/apache/calcite/rex/RexOver.java | 2 +- .../calcite/rex/RexPermuteInputsShuttle.java | 2 +- .../org/apache/calcite/rex/RexProgram.java | 10 +- .../apache/calcite/rex/RexProgramBuilder.java | 6 +- .../org/apache/calcite/rex/RexRangeRef.java | 2 +- .../org/apache/calcite/rex/RexShuttle.java | 7 +- .../org/apache/calcite/rex/RexSimplify.java | 4 +- .../apache/calcite/rex/RexSqlConvertlet.java | 2 +- .../calcite/rex/RexSqlConvertletTable.java | 2 +- .../rex/RexSqlReflectiveConvertletTable.java | 2 +- .../rex/RexSqlStandardConvertletTable.java | 4 +- .../org/apache/calcite/rex/RexSubQuery.java | 2 +- .../apache/calcite/rex/RexTableInputRef.java | 2 +- .../calcite/rex/RexToSqlNodeConverter.java | 2 +- .../rex/RexToSqlNodeConverterImpl.java | 2 +- .../apache/calcite/rex/RexUnaryBiVisitor.java | 4 +- .../java/org/apache/calcite/rex/RexUtil.java | 2 +- .../apache/calcite/rex/RexVisitorImpl.java | 4 +- .../org/apache/calcite/rex/RexWindow.java | 4 +- .../apache/calcite/rex/RexWindowBound.java | 13 +- .../apache/calcite/rex/RexWindowBounds.java | 2 +- .../org/apache/calcite/rex/package-info.java | 8 +- .../runtime/AbstractImmutableList.java | 2 +- .../apache/calcite/runtime/ArrayBindable.java | 2 +- .../runtime/ArrayEnumeratorCursor.java | 2 +- .../org/apache/calcite/runtime/Automaton.java | 2 +- .../calcite/runtime/AutomatonBuilder.java | 4 +- .../runtime/CalciteContextException.java | 4 +- .../calcite/runtime/CalciteException.java | 4 +- .../calcite/runtime/CalciteResource.java | 2 +- .../calcite/runtime/CompressionFunctions.java | 2 +- .../org/apache/calcite/runtime/ConsList.java | 5 +- .../runtime/DeterministicAutomaton.java | 4 +- .../apache/calcite/runtime/Enumerables.java | 2 +- .../org/apache/calcite/runtime/FlatLists.java | 23 ++- .../calcite/runtime/FunctionContexts.java | 2 +- .../org/apache/calcite/runtime/HttpUtils.java | 2 +- .../calcite/runtime/ImmutablePairList.java | 4 +- .../apache/calcite/runtime/JsonFunctions.java | 8 +- .../java/org/apache/calcite/runtime/Like.java | 2 +- .../org/apache/calcite/runtime/MapEntry.java | 2 +- .../org/apache/calcite/runtime/Matcher.java | 2 +- .../org/apache/calcite/runtime/PairList.java | 7 +- .../org/apache/calcite/runtime/PairLists.java | 4 +- .../apache/calcite/runtime/PredicateImpl.java | 2 +- .../calcite/runtime/RandomFunction.java | 3 +- .../org/apache/calcite/runtime/Resources.java | 24 +-- .../calcite/runtime/ResultSetEnumerable.java | 2 +- .../calcite/runtime/SpaceFillingCurve2D.java | 2 +- .../calcite/runtime/SpatialTypeFunctions.java | 2 +- .../apache/calcite/runtime/SqlFunctions.java | 182 +++++++++--------- .../org/apache/calcite/runtime/Utilities.java | 2 +- .../apache/calcite/runtime/XmlFunctions.java | 2 +- .../apache/calcite/runtime/package-info.java | 8 +- .../runtime/rtti/BasicSqlTypeRtti.java | 2 +- .../runtime/rtti/GenericSqlTypeRtti.java | 2 +- .../calcite/runtime/rtti/RowSqlTypeRtti.java | 2 +- .../runtime/rtti/RuntimeTypeInformation.java | 2 +- .../calcite/runtime/rtti/package-info.java | 3 + .../runtime/variant/VariantNonNull.java | 2 +- .../calcite/runtime/variant/VariantNull.java | 2 +- .../runtime/variant/VariantSqlNull.java | 2 +- .../runtime/variant/VariantSqlValue.java | 2 +- .../calcite/runtime/variant/VariantValue.java | 2 +- .../calcite/runtime/variant/package-info.java | 3 + .../calcite/schema/FilterableTable.java | 2 +- .../calcite/schema/FunctionContext.java | 2 +- .../calcite/schema/ModifiableTable.java | 2 +- .../schema/ProjectableFilterableTable.java | 2 +- .../apache/calcite/schema/ScannableTable.java | 2 +- .../org/apache/calcite/schema/Schema.java | 2 +- .../org/apache/calcite/schema/SchemaPlus.java | 4 +- .../org/apache/calcite/schema/Schemas.java | 2 +- .../org/apache/calcite/schema/Statistic.java | 2 +- .../org/apache/calcite/schema/Statistics.java | 2 +- .../java/org/apache/calcite/schema/Table.java | 2 +- .../apache/calcite/schema/TableFactory.java | 2 +- .../apache/calcite/schema/TableFunction.java | 2 +- .../org/apache/calcite/schema/TableMacro.java | 2 +- .../org/apache/calcite/schema/Wrapper.java | 8 +- .../calcite/schema/impl/AbstractSchema.java | 2 +- .../calcite/schema/impl/AbstractTable.java | 4 +- .../schema/impl/AggregateFunctionImpl.java | 2 +- .../calcite/schema/impl/DelegatingSchema.java | 2 +- .../schema/impl/ListTransientTable.java | 2 +- .../schema/impl/LongSchemaVersion.java | 2 +- .../schema/impl/MaterializedViewTable.java | 2 +- .../schema/impl/ModifiableViewTable.java | 4 +- .../schema/impl/ReflectiveFunctionBase.java | 2 +- .../schema/impl/ScalarFunctionImpl.java | 2 +- .../apache/calcite/schema/impl/StarTable.java | 4 +- .../schema/impl/TableFunctionImpl.java | 2 +- .../calcite/schema/impl/TableMacroImpl.java | 2 +- .../apache/calcite/schema/impl/ViewTable.java | 2 +- .../calcite/schema/impl/ViewTableMacro.java | 2 +- .../calcite/schema/impl/package-info.java | 3 + .../schema/lookup/CompatibilityLookup.java | 2 +- .../calcite/schema/lookup/ConcatLookup.java | 2 +- .../calcite/schema/lookup/EmptyLookup.java | 2 +- .../schema/lookup/IgnoreCaseLookup.java | 2 +- .../schema/lookup/LoadingCacheLookup.java | 2 +- .../apache/calcite/schema/lookup/Lookup.java | 2 +- .../calcite/schema/lookup/NameMapLookup.java | 2 +- .../apache/calcite/schema/lookup/Named.java | 4 +- .../calcite/schema/lookup/SnapshotLookup.java | 2 +- .../schema/lookup/TransformingLookup.java | 2 +- .../calcite/schema/lookup/package-info.java | 8 +- .../apache/calcite/schema/package-info.java | 8 +- .../server/CalciteServerStatement.java | 2 +- .../calcite/server/DdlExecutorImpl.java | 2 +- .../apache/calcite/server/package-info.java | 8 +- .../calcite/sql/ExplicitOperatorBinding.java | 2 +- .../apache/calcite/sql/SqlAggFunction.java | 4 +- .../java/org/apache/calcite/sql/SqlAlter.java | 2 +- .../org/apache/calcite/sql/SqlAsofJoin.java | 8 +- .../org/apache/calcite/sql/SqlBasicCall.java | 4 +- .../apache/calcite/sql/SqlBasicFunction.java | 2 +- .../calcite/sql/SqlBasicTypeNameSpec.java | 2 +- .../apache/calcite/sql/SqlBinaryOperator.java | 2 +- .../org/apache/calcite/sql/SqlByRewriter.java | 2 +- .../java/org/apache/calcite/sql/SqlCall.java | 5 +- .../apache/calcite/sql/SqlCallBinding.java | 6 +- .../calcite/sql/SqlCharStringLiteral.java | 2 +- .../org/apache/calcite/sql/SqlCollation.java | 6 +- .../sql/SqlConstantValueAggFunction.java | 2 +- .../apache/calcite/sql/SqlDataTypeSpec.java | 2 +- .../org/apache/calcite/sql/SqlDelete.java | 8 +- .../apache/calcite/sql/SqlDescribeSchema.java | 6 +- .../apache/calcite/sql/SqlDescribeTable.java | 8 +- .../org/apache/calcite/sql/SqlDialect.java | 6 +- .../calcite/sql/SqlDialectFactoryImpl.java | 2 +- .../apache/calcite/sql/SqlDynamicParam.java | 2 +- .../org/apache/calcite/sql/SqlExplain.java | 14 +- .../org/apache/calcite/sql/SqlFunction.java | 4 +- .../calcite/sql/SqlFunctionalOperator.java | 2 +- .../calcite/sql/SqlGroupedWindowFunction.java | 2 +- .../java/org/apache/calcite/sql/SqlHint.java | 2 +- .../org/apache/calcite/sql/SqlIdentifier.java | 4 +- .../apache/calcite/sql/SqlInfixOperator.java | 2 +- .../org/apache/calcite/sql/SqlInsert.java | 10 +- .../calcite/sql/SqlInternalOperator.java | 2 +- .../calcite/sql/SqlIntervalLiteral.java | 2 +- .../calcite/sql/SqlIntervalQualifier.java | 2 +- .../calcite/sql/SqlJdbcDataTypeName.java | 2 +- .../calcite/sql/SqlJdbcFunctionCall.java | 4 +- .../java/org/apache/calcite/sql/SqlJoin.java | 8 +- .../org/apache/calcite/sql/SqlLambda.java | 2 +- .../org/apache/calcite/sql/SqlLiteral.java | 4 +- .../apache/calcite/sql/SqlMatchFunction.java | 2 +- .../apache/calcite/sql/SqlMatchRecognize.java | 8 +- .../java/org/apache/calcite/sql/SqlMerge.java | 8 +- .../java/org/apache/calcite/sql/SqlNode.java | 2 +- .../org/apache/calcite/sql/SqlNodeList.java | 16 +- .../calcite/sql/SqlNullTreatmentOperator.java | 2 +- .../apache/calcite/sql/SqlNumericLiteral.java | 4 +- .../org/apache/calcite/sql/SqlOperator.java | 6 +- .../calcite/sql/SqlOperatorBinding.java | 4 +- .../apache/calcite/sql/SqlOperatorTable.java | 2 +- .../org/apache/calcite/sql/SqlOrderBy.java | 6 +- .../java/org/apache/calcite/sql/SqlPivot.java | 4 +- .../calcite/sql/SqlPostfixOperator.java | 2 +- .../apache/calcite/sql/SqlPrefixOperator.java | 2 +- .../org/apache/calcite/sql/SqlSelect.java | 19 +- .../apache/calcite/sql/SqlSelectOperator.java | 2 +- .../apache/calcite/sql/SqlSetOperator.java | 2 +- .../org/apache/calcite/sql/SqlSetOption.java | 6 +- .../sql/SqlSetSemanticsTableOperator.java | 2 +- .../org/apache/calcite/sql/SqlSnapshot.java | 4 +- .../sql/SqlSpatialTypeOperatorTable.java | 2 +- .../calcite/sql/SqlSpecialOperator.java | 2 +- .../calcite/sql/SqlSplittableAggFunction.java | 2 +- .../apache/calcite/sql/SqlStarExclude.java | 4 +- .../apache/calcite/sql/SqlStarReplace.java | 4 +- .../calcite/sql/SqlStaticAggFunction.java | 2 +- .../org/apache/calcite/sql/SqlSyntax.java | 4 +- .../apache/calcite/sql/SqlTableFunction.java | 2 +- .../org/apache/calcite/sql/SqlTableRef.java | 2 +- .../org/apache/calcite/sql/SqlUnpivot.java | 4 +- .../calcite/sql/SqlUnresolvedFunction.java | 2 +- .../org/apache/calcite/sql/SqlUpdate.java | 10 +- .../java/org/apache/calcite/sql/SqlUtil.java | 7 +- .../org/apache/calcite/sql/SqlWindow.java | 14 +- .../calcite/sql/SqlWindowTableFunction.java | 2 +- .../java/org/apache/calcite/sql/SqlWith.java | 6 +- .../org/apache/calcite/sql/SqlWithItem.java | 8 +- .../org/apache/calcite/sql/SqlWriter.java | 18 +- .../apache/calcite/sql/SqlWriterConfig.java | 2 +- .../calcite/sql/TableCharacteristic.java | 2 +- .../apache/calcite/sql/advise/SqlAdvisor.java | 4 +- .../advise/SqlAdvisorGetHintsFunction.java | 2 +- .../advise/SqlAdvisorGetHintsFunction2.java | 2 +- .../calcite/sql/advise/SqlAdvisorHint.java | 2 +- .../calcite/sql/advise/SqlAdvisorHint2.java | 2 +- .../calcite/sql/advise/SqlSimpleParser.java | 2 +- .../calcite/sql/advise/package-info.java | 3 + .../sql/ddl/SqlAttributeDefinition.java | 4 +- .../calcite/sql/ddl/SqlCheckConstraint.java | 4 +- .../calcite/sql/ddl/SqlColumnDeclaration.java | 4 +- .../sql/ddl/SqlCreateForeignSchema.java | 4 +- .../calcite/sql/ddl/SqlCreateFunction.java | 2 +- .../sql/ddl/SqlCreateMaterializedView.java | 4 +- .../calcite/sql/ddl/SqlCreateSchema.java | 2 +- .../calcite/sql/ddl/SqlCreateTable.java | 4 +- .../calcite/sql/ddl/SqlCreateTableLike.java | 2 +- .../apache/calcite/sql/ddl/SqlCreateType.java | 4 +- .../apache/calcite/sql/ddl/SqlCreateView.java | 4 +- .../calcite/sql/ddl/SqlDropFunction.java | 2 +- .../sql/ddl/SqlDropMaterializedView.java | 2 +- .../apache/calcite/sql/ddl/SqlDropSchema.java | 2 +- .../apache/calcite/sql/ddl/SqlDropTable.java | 2 +- .../apache/calcite/sql/ddl/SqlDropType.java | 2 +- .../apache/calcite/sql/ddl/SqlDropView.java | 2 +- .../calcite/sql/ddl/SqlKeyConstraint.java | 4 +- .../calcite/sql/ddl/SqlTruncateTable.java | 2 +- .../apache/calcite/sql/ddl/package-info.java | 3 + .../sql/dialect/BigQuerySqlDialect.java | 2 +- .../sql/dialect/ClickHouseSqlDialect.java | 2 +- .../calcite/sql/dialect/DorisSqlDialect.java | 2 +- .../calcite/sql/dialect/ExasolSqlDialect.java | 2 +- .../sql/dialect/FireboltSqlDialect.java | 2 +- .../calcite/sql/dialect/HiveSqlDialect.java | 2 +- .../calcite/sql/dialect/HsqldbSqlDialect.java | 2 +- .../sql/dialect/JethroDataSqlDialect.java | 2 +- .../calcite/sql/dialect/MssqlSqlDialect.java | 2 +- .../calcite/sql/dialect/MysqlSqlDialect.java | 2 +- .../calcite/sql/dialect/OracleSqlDialect.java | 2 +- .../sql/dialect/PhoenixSqlDialect.java | 2 +- .../sql/dialect/PostgresqlSqlDialect.java | 2 +- .../calcite/sql/dialect/PrestoSqlDialect.java | 2 +- .../sql/dialect/RedshiftSqlDialect.java | 2 +- .../sql/dialect/SnowflakeSqlDialect.java | 2 +- .../calcite/sql/dialect/SparkSqlDialect.java | 2 +- .../calcite/sql/dialect/SqliteSqlDialect.java | 2 +- .../sql/dialect/StarRocksSqlDialect.java | 2 +- .../calcite/sql/dialect/SybaseSqlDialect.java | 2 +- .../calcite/sql/dialect/TrinoSqlDialect.java | 2 +- .../sql/dialect/VerticaSqlDialect.java | 2 +- .../calcite/sql/dialect/package-info.java | 3 + .../sql/fun/SqlAbstractGroupFunction.java | 2 +- .../sql/fun/SqlAnyValueAggFunction.java | 4 +- .../calcite/sql/fun/SqlAvgAggFunction.java | 2 +- .../calcite/sql/fun/SqlBasicAggFunction.java | 4 +- .../calcite/sql/fun/SqlBitOpAggFunction.java | 4 +- .../calcite/sql/fun/SqlCallFactory.java | 2 +- .../org/apache/calcite/sql/fun/SqlCase.java | 6 +- .../calcite/sql/fun/SqlCaseOperator.java | 4 +- .../calcite/sql/fun/SqlCoalesceFunction.java | 2 +- .../calcite/sql/fun/SqlConvertFunction.java | 2 +- .../calcite/sql/fun/SqlCountAggFunction.java | 4 +- .../calcite/sql/fun/SqlFloorFunction.java | 2 +- .../calcite/sql/fun/SqlGroupingFunction.java | 4 +- .../calcite/sql/fun/SqlInternalOperators.java | 4 +- .../sql/fun/SqlJsonArrayAggAggFunction.java | 2 +- .../calcite/sql/fun/SqlJsonArrayFunction.java | 2 +- .../calcite/sql/fun/SqlJsonDepthFunction.java | 2 +- .../sql/fun/SqlJsonModifyFunction.java | 2 +- .../sql/fun/SqlJsonObjectFunction.java | 2 +- .../sql/fun/SqlJsonPrettyFunction.java | 2 +- .../calcite/sql/fun/SqlJsonQueryFunction.java | 2 +- .../calcite/sql/fun/SqlJsonTypeFunction.java | 2 +- .../calcite/sql/fun/SqlJsonValueFunction.java | 2 +- .../apache/calcite/sql/fun/SqlLibrary.java | 2 +- .../fun/SqlLibraryOperatorTableFactory.java | 2 +- .../calcite/sql/fun/SqlLibraryOperators.java | 8 +- .../sql/fun/SqlLiteralAggFunction.java | 2 +- .../sql/fun/SqlMapValueConstructor.java | 4 +- .../calcite/sql/fun/SqlMinMaxAggFunction.java | 4 +- .../sql/fun/SqlMonotonicUnaryFunction.java | 2 +- .../sql/fun/SqlMultisetValueConstructor.java | 2 +- .../calcite/sql/fun/SqlOverlapsOperator.java | 2 +- .../calcite/sql/fun/SqlQuantifyOperator.java | 2 +- .../calcite/sql/fun/SqlRowOperator.java | 2 +- .../sql/fun/SqlSingleValueAggFunction.java | 4 +- .../sql/fun/SqlSpatialTypeFunctions.java | 2 +- .../calcite/sql/fun/SqlStdOperatorTable.java | 2 +- .../calcite/sql/fun/SqlSumAggFunction.java | 4 +- .../sql/fun/SqlSumEmptyIsZeroAggFunction.java | 4 +- .../sql/fun/SqlTimestampAddFunction.java | 2 +- .../calcite/sql/fun/SqlTrimFunction.java | 2 +- .../apache/calcite/sql/fun/package-info.java | 3 + .../org/apache/calcite/sql/package-info.java | 8 +- .../org/apache/calcite/sql/parser/Span.java | 2 +- .../sql/parser/SqlAbstractParserImpl.java | 10 +- .../calcite/sql/parser/SqlParserPos.java | 2 +- .../calcite/sql/parser/SqlParserUtil.java | 2 +- .../calcite/sql/parser/StringAndPos.java | 2 +- .../calcite/sql/parser/impl/package-info.java | 3 + .../calcite/sql/parser/package-info.java | 3 + .../calcite/sql/pretty/SqlPrettyWriter.java | 4 +- .../calcite/sql/pretty/package-info.java | 3 + .../calcite/sql/type/AbstractSqlType.java | 2 +- .../apache/calcite/sql/type/ArraySqlType.java | 2 +- .../type/AssignableOperandTypeChecker.java | 2 +- .../apache/calcite/sql/type/BasicSqlType.java | 2 +- .../sql/type/CompositeOperandTypeChecker.java | 7 +- .../CompositeSingleOperandTypeChecker.java | 2 +- .../sql/type/CursorReturnTypeInference.java | 2 +- .../type/JavaToSqlTypeConversionRules.java | 2 +- .../apache/calcite/sql/type/MapSqlType.java | 2 +- .../sql/type/MatchReturnTypeInference.java | 2 +- .../calcite/sql/type/MultisetSqlType.java | 2 +- .../calcite/sql/type/ObjectSqlType.java | 2 +- .../calcite/sql/type/OperandHandlers.java | 2 +- .../apache/calcite/sql/type/OperandTypes.java | 4 +- .../apache/calcite/sql/type/ReturnTypes.java | 2 +- .../sql/type/SameOperandTypeChecker.java | 2 +- ...meOperandTypeExceptLastOperandChecker.java | 2 +- .../sql/type/SqlOperandTypeChecker.java | 2 +- .../sql/type/SqlReturnTypeInference.java | 2 +- .../sql/type/SqlReturnTypeInferenceChain.java | 2 +- .../type/SqlTypeExplicitPrecedenceList.java | 2 +- .../calcite/sql/type/SqlTypeFactoryImpl.java | 2 +- .../calcite/sql/type/SqlTypeFamily.java | 2 +- .../apache/calcite/sql/type/SqlTypeName.java | 2 +- .../sql/type/SqlTypeTransformCascade.java | 2 +- .../apache/calcite/sql/type/SqlTypeUtil.java | 10 +- .../TableFunctionReturnTypeInference.java | 6 +- .../apache/calcite/sql/type/package-info.java | 3 + .../sql/util/ChainedSqlOperatorTable.java | 2 +- .../org/apache/calcite/sql/util/IdPair.java | 2 +- .../sql/util/ListSqlOperatorTable.java | 2 +- .../sql/util/ReflectiveSqlOperatorTable.java | 2 +- .../calcite/sql/util/SqlBasicVisitor.java | 8 +- .../apache/calcite/sql/util/SqlShuttle.java | 2 +- .../apache/calcite/sql/util/SqlString.java | 4 +- .../apache/calcite/sql/util/package-info.java | 3 + .../sql/validate/AbstractNamespace.java | 2 +- .../calcite/sql/validate/AggFinder.java | 2 +- .../calcite/sql/validate/AggVisitor.java | 2 +- .../calcite/sql/validate/AliasNamespace.java | 2 +- .../sql/validate/CollectNamespace.java | 2 +- .../calcite/sql/validate/CollectScope.java | 2 +- .../sql/validate/DelegatingNamespace.java | 2 +- .../calcite/sql/validate/DelegatingScope.java | 4 +- .../DelegatingSqlValidatorCatalogReader.java | 4 +- .../calcite/sql/validate/EmptyScope.java | 2 +- .../calcite/sql/validate/FieldNamespace.java | 2 +- .../sql/validate/IdentifierNamespace.java | 4 +- .../calcite/sql/validate/JoinNamespace.java | 2 +- .../calcite/sql/validate/JoinScope.java | 2 +- .../calcite/sql/validate/LambdaNamespace.java | 2 +- .../calcite/sql/validate/ListScope.java | 2 +- .../sql/validate/MatchRecognizeNamespace.java | 2 +- .../calcite/sql/validate/MeasureScope.java | 2 +- .../calcite/sql/validate/OrderByScope.java | 2 +- .../sql/validate/ParameterNamespace.java | 2 +- .../calcite/sql/validate/ParameterScope.java | 2 +- .../sql/validate/ProcedureNamespace.java | 2 +- .../calcite/sql/validate/SchemaNamespace.java | 2 +- .../calcite/sql/validate/SelectScope.java | 4 +- .../calcite/sql/validate/SemanticTable.java | 2 +- .../calcite/sql/validate/SetopNamespace.java | 2 +- .../calcite/sql/validate/SqlLambdaScope.java | 2 +- .../calcite/sql/validate/SqlMonikerImpl.java | 2 +- .../calcite/sql/validate/SqlNameMatcher.java | 2 +- .../calcite/sql/validate/SqlNameMatchers.java | 2 +- .../sql/validate/SqlNonNullableAccessors.java | 2 +- .../calcite/sql/validate/SqlQualified.java | 2 +- .../sql/validate/SqlScopedShuttle.java | 2 +- .../validate/SqlUserDefinedAggFunction.java | 2 +- .../sql/validate/SqlUserDefinedFunction.java | 2 +- .../validate/SqlUserDefinedTableFunction.java | 2 +- .../validate/SqlUserDefinedTableMacro.java | 2 +- .../calcite/sql/validate/SqlValidator.java | 6 +- .../validate/SqlValidatorCatalogReader.java | 2 +- .../sql/validate/SqlValidatorException.java | 2 +- .../sql/validate/SqlValidatorImpl.java | 27 +-- .../sql/validate/SqlValidatorNamespace.java | 4 +- .../sql/validate/SqlValidatorScope.java | 2 +- .../sql/validate/SqlValidatorUtil.java | 7 +- .../sql/validate/SqlValidatorWithHints.java | 2 +- .../sql/validate/SqlWithItemTableRef.java | 2 +- .../validate/TableConstructorNamespace.java | 2 +- .../calcite/sql/validate/TableNamespace.java | 2 +- .../calcite/sql/validate/UnnestNamespace.java | 2 +- .../sql/validate/WithItemNamespace.java | 2 +- .../validate/WithItemRecursiveNamespace.java | 2 +- .../calcite/sql/validate/WithNamespace.java | 2 +- .../sql/validate/WithRecursiveScope.java | 2 +- .../calcite/sql/validate/WithScope.java | 2 +- .../implicit/AbstractTypeCoercion.java | 2 +- .../sql/validate/implicit/TypeCoercion.java | 2 +- .../validate/implicit/TypeCoercionImpl.java | 2 +- .../sql/validate/implicit/package-info.java | 3 + .../calcite/sql/validate/package-info.java | 3 + .../apache/calcite/sql2rel/AggConverter.java | 2 +- .../sql2rel/CorrelateProjectExtractor.java | 2 +- .../sql2rel/CorrelationReferenceFinder.java | 7 +- .../DeduplicateCorrelateVariables.java | 7 +- .../sql2rel/InitializerExpressionFactory.java | 2 +- .../NullInitializerExpressionFactory.java | 2 +- .../sql2rel/ReflectiveConvertletTable.java | 13 +- .../calcite/sql2rel/RelDecorrelator.java | 4 +- .../calcite/sql2rel/RelFieldTrimmer.java | 4 +- .../sql2rel/RelStructuredTypeFlattener.java | 5 +- .../sql2rel/SqlRexConvertletTable.java | 2 +- .../calcite/sql2rel/SqlToRelConverter.java | 6 +- .../sql2rel/StandardConvertletTable.java | 13 +- .../calcite/sql2rel/SubQueryConverter.java | 2 +- .../sql2rel/TopDownGeneralDecorrelator.java | 6 +- .../apache/calcite/sql2rel/package-info.java | 8 +- .../calcite/statistic/package-info.java | 8 +- .../apache/calcite/tools/FrameworkConfig.java | 2 +- .../org/apache/calcite/tools/Frameworks.java | 2 +- .../java/org/apache/calcite/tools/Hoist.java | 2 +- .../apache/calcite/tools/PigRelBuilder.java | 2 +- .../org/apache/calcite/tools/RelBuilder.java | 2 +- .../calcite/tools/RelBuilderFactory.java | 2 +- .../org/apache/calcite/tools/RuleSets.java | 2 +- .../apache/calcite/tools/package-info.java | 8 +- .../java/org/apache/calcite/util/Arrow.java | 2 +- .../util/BarfingInvocationHandler.java | 2 +- .../java/org/apache/calcite/util/BitSets.java | 2 +- .../org/apache/calcite/util/BitString.java | 2 +- .../org/apache/calcite/util/BlackholeMap.java | 6 +- .../apache/calcite/util/BuiltInMethod.java | 2 +- .../org/apache/calcite/util/ChunkList.java | 4 +- .../org/apache/calcite/util/CompositeMap.java | 13 +- .../apache/calcite/util/ConversionUtil.java | 2 +- .../org/apache/calcite/util/DateString.java | 4 +- .../util/DelegatingInvocationHandler.java | 2 +- .../org/apache/calcite/util/Filterator.java | 4 +- .../org/apache/calcite/util/Glossary.java | 2 +- .../java/org/apache/calcite/util/Holder.java | 2 +- .../apache/calcite/util/ImmutableBitSet.java | 8 +- .../apache/calcite/util/ImmutableIntList.java | 4 +- .../calcite/util/ImmutableNullableList.java | 2 +- .../calcite/util/ImmutableNullableSet.java | 6 +- .../calcite/util/IntegerIntervalSet.java | 2 +- .../org/apache/calcite/util/JdbcType.java | 2 +- .../org/apache/calcite/util/JdbcTypeImpl.java | 2 +- .../org/apache/calcite/util/JsonBuilder.java | 2 +- .../java/org/apache/calcite/util/Litmus.java | 2 +- .../calcite/util/MonotonicSupplier.java | 2 +- .../java/org/apache/calcite/util/NameMap.java | 2 +- .../org/apache/calcite/util/NameMultimap.java | 2 +- .../java/org/apache/calcite/util/NameSet.java | 8 +- .../org/apache/calcite/util/NlsString.java | 7 +- .../org/apache/calcite/util/NumberUtil.java | 17 +- .../java/org/apache/calcite/util/Pair.java | 7 +- .../calcite/util/PartiallyOrderedSet.java | 4 +- .../org/apache/calcite/util/Permutation.java | 9 +- .../util/PrecedenceClimbingParser.java | 2 +- .../org/apache/calcite/util/RangeSets.java | 4 +- .../org/apache/calcite/util/ReflectUtil.java | 6 +- .../util/ReflectiveVisitDispatcher.java | 4 +- .../java/org/apache/calcite/util/Sarg.java | 4 +- .../calcite/util/SerializableCharset.java | 4 +- .../calcite/util/SimpleNamespaceContext.java | 4 +- .../java/org/apache/calcite/util/Source.java | 2 +- .../java/org/apache/calcite/util/Sources.java | 2 +- .../org/apache/calcite/util/Template.java | 2 +- .../org/apache/calcite/util/TimeString.java | 4 +- .../calcite/util/TimeWithTimeZoneString.java | 2 +- .../apache/calcite/util/TimestampString.java | 2 +- .../util/TimestampWithTimeZoneString.java | 2 +- .../apache/calcite/util/TryThreadLocal.java | 4 +- .../java/org/apache/calcite/util/Util.java | 29 +-- .../org/apache/calcite/util/XmlOutput.java | 4 +- .../calcite/util/format/package-info.java | 3 + .../postgresql/CompiledDateTimeFormat.java | 2 +- .../PostgresqlDateTimeFormatter.java | 2 +- .../format/compiled/package-info.java | 3 + .../postgresql/format/package-info.java | 3 + .../util/format/postgresql/package-info.java | 3 + .../util/graph/AttributedDirectedGraph.java | 5 +- .../util/graph/DefaultDirectedGraph.java | 14 +- .../calcite/util/graph/DefaultEdge.java | 8 +- .../calcite/util/graph/DirectedGraph.java | 2 +- .../org/apache/calcite/util/graph/Graphs.java | 2 +- .../util/graph/TopologicalOrderIterator.java | 5 +- .../calcite/util/graph/package-info.java | 3 + .../calcite/util/javac/JaninoCompiler.java | 2 +- .../calcite/util/javac/package-info.java | 3 + .../util/mapping/AbstractSourceMapping.java | 2 +- .../util/mapping/AbstractTargetMapping.java | 2 +- .../apache/calcite/util/mapping/IntPair.java | 2 +- .../apache/calcite/util/mapping/Mappings.java | 8 +- .../calcite/util/mapping/package-info.java | 3 + .../org/apache/calcite/util/package-info.java | 8 +- .../calcite/util/trace/CalciteLogger.java | 2 +- .../util/trace/CalciteTimingTracer.java | 2 +- .../calcite/util/trace/CalciteTrace.java | 2 +- .../calcite/util/trace/package-info.java | 3 + .../EnumerableCustomAggregateTest.java | 2 +- .../enumerable/RexImplementorTableTest.java | 2 +- .../calcite/adapter/generate/RangeTable.java | 2 +- .../calcite/jdbc/CalciteRemoteDriverTest.java | 2 +- ...omMaterializedViewRecognitionRuleTest.java | 2 +- .../apache/calcite/plan/RelWriterTest.java | 2 +- .../plan/volcano/CollationConversionTest.java | 2 +- .../calcite/plan/volcano/ComboRuleTest.java | 2 +- .../volcano/MultipleTraitConversionTest.java | 2 +- .../calcite/plan/volcano/PlannerTests.java | 2 +- .../plan/volcano/TraitConversionTest.java | 2 +- .../plan/volcano/TraitPropagationTest.java | 2 +- .../plan/volcano/VolcanoPlannerTraitTest.java | 2 +- .../prepare/LookupOperatorOverloadsTest.java | 2 +- .../rel/logical/ToLogicalConverterTest.java | 2 +- .../rel/rel2sql/RelToSqlConverterTest.java | 2 +- .../apache/calcite/rex/RexProgramTest.java | 2 +- .../calcite/runtime/EnumerablesTest.java | 2 +- .../calcite/schema/lookup/FakeLookup.java | 2 +- .../schema/lookup/IgnoreCaseLookupTest.java | 2 +- .../calcite/schemas/HrClusteredSchema.java | 2 +- .../calcite/sql/test/SqlAdvisorTest.java | 2 +- .../sql/test/SqlPrettyWriterFixture.java | 2 +- .../calcite/sql/test/SqlPrettyWriterTest.java | 2 +- .../sql/type/RelDataTypeSystemTest.java | 2 +- .../sql/validate/LexCaseSensitiveTest.java | 2 +- .../calcite/sql/validate/LexEscapeTest.java | 2 +- .../CorrelateProjectExtractorTest.java | 2 +- .../calcite/sql2rel/RelDecorrelatorTest.java | 2 +- .../calcite/sql2rel/RelFieldTrimmerTest.java | 2 +- .../calcite/test/CollectionTypeTest.java | 2 +- .../apache/calcite/test/CoreQuidemTest.java | 2 +- .../apache/calcite/test/HepPlannerTest.java | 2 +- .../apache/calcite/test/InterpreterTest.java | 2 +- .../org/apache/calcite/test/JdbcTest.java | 4 +- .../org/apache/calcite/test/LintTest.java | 70 ++++++- .../calcite/test/MaterializationTest.java | 2 +- .../calcite/test/MaterializedViewFixture.java | 2 +- .../apache/calcite/test/RelBuilderTest.java | 2 +- .../apache/calcite/test/RelMetadataTest.java | 4 +- .../apache/calcite/test/RelOptRulesTest.java | 2 +- .../calcite/test/RuleMatchVisualizerTest.java | 2 +- .../calcite/test/ScannableTableTest.java | 2 +- .../calcite/test/SqlHintsConverterTest.java | 2 +- .../org/apache/calcite/test/SqlTestGen.java | 2 +- .../calcite/test/SqlToRelConverterTest.java | 2 +- .../calcite/test/SqlValidatorFeatureTest.java | 2 +- .../apache/calcite/test/SqlValidatorTest.java | 2 +- .../calcite/test/SqlXmlFunctionsTest.java | 2 +- .../apache/calcite/test/TCatalogReader.java | 2 +- .../apache/calcite/test/TopDownOptTest.java | 2 +- .../test/TypeCoercionConverterTest.java | 2 +- .../apache/calcite/test/TypeCoercionTest.java | 2 +- .../ConcurrentTestCommandExecutor.java | 2 +- .../ConcurrentTestCommandGenerator.java | 2 +- .../ConcurrentTestCommandScript.java | 2 +- .../ConcurrentTestPluginCommand.java | 2 +- .../apache/calcite/tools/FrameworksTest.java | 2 +- .../org/apache/calcite/util/TestUnsafe.java | 2 +- .../org/apache/calcite/util/UtilTest.java | 4 +- .../calcite/util/graph/DirectedGraphTest.java | 2 +- .../druid/BinaryOperatorConversion.java | 2 +- .../adapter/druid/CeilOperatorConversion.java | 2 +- .../adapter/druid/DefaultDimensionSpec.java | 2 +- .../calcite/adapter/druid/DimensionSpec.java | 2 +- .../druid/DirectOperatorConversion.java | 2 +- .../adapter/druid/DruidConnectionImpl.java | 2 +- .../adapter/druid/DruidDateTimeUtils.java | 2 +- .../adapter/druid/DruidExpressions.java | 2 +- .../adapter/druid/DruidJsonFilter.java | 2 +- .../calcite/adapter/druid/DruidQuery.java | 2 +- .../calcite/adapter/druid/DruidRules.java | 2 +- .../calcite/adapter/druid/DruidSchema.java | 2 +- .../adapter/druid/DruidSqlCastConverter.java | 2 +- .../druid/DruidSqlOperatorConverter.java | 2 +- .../calcite/adapter/druid/DruidTable.java | 2 +- .../adapter/druid/DruidTableFactory.java | 2 +- .../druid/ExtractOperatorConversion.java | 2 +- .../druid/ExtractionDimensionSpec.java | 2 +- .../druid/FloorOperatorConversion.java | 2 +- .../adapter/druid/NaryOperatorConverter.java | 2 +- .../druid/SubstringOperatorConversion.java | 2 +- .../adapter/druid/TimeExtractionFunction.java | 2 +- .../druid/UnaryPrefixOperatorConversion.java | 2 +- .../druid/UnarySuffixOperatorConversion.java | 2 +- .../elasticsearch/ElasticsearchAggregate.java | 2 +- .../elasticsearch/ElasticsearchFilter.java | 2 +- .../elasticsearch/ElasticsearchJson.java | 2 +- .../elasticsearch/ElasticsearchMapping.java | 2 +- .../elasticsearch/ElasticsearchProject.java | 2 +- .../elasticsearch/ElasticsearchRules.java | 2 +- .../elasticsearch/ElasticsearchSchema.java | 2 +- .../elasticsearch/ElasticsearchSort.java | 2 +- .../elasticsearch/ElasticsearchTableScan.java | 2 +- .../ElasticsearchToEnumerableConverter.java | 2 +- .../adapter/csv/CsvFilterableTable.java | 2 +- .../adapter/csv/CsvProjectTableScanRule.java | 4 +- .../adapter/csv/CsvScannableTable.java | 2 +- .../apache/calcite/adapter/csv/CsvSchema.java | 2 +- .../adapter/csv/CsvStreamScannableTable.java | 2 +- .../adapter/csv/CsvStreamTableFactory.java | 2 +- .../apache/calcite/adapter/csv/CsvTable.java | 2 +- .../calcite/adapter/csv/CsvTableFactory.java | 2 +- .../calcite/adapter/csv/CsvTableScan.java | 2 +- .../adapter/csv/CsvTranslatableTable.java | 2 +- .../java/org/apache/calcite/test/CsvTest.java | 2 +- .../calcite/example/maze/MazeTable.java | 2 +- .../calcite/adapter/file/CsvEnumerator.java | 2 +- .../calcite/adapter/file/CsvStreamReader.java | 2 +- .../apache/calcite/adapter/file/CsvTable.java | 2 +- .../calcite/adapter/file/CsvTableFactory.java | 2 +- .../calcite/adapter/file/CsvTableScan.java | 2 +- .../adapter/file/CsvTranslatableTable.java | 2 +- .../calcite/adapter/file/FileEnumerator.java | 2 +- .../calcite/adapter/file/FileFieldType.java | 2 +- .../calcite/adapter/file/FileReader.java | 2 +- .../adapter/file/FileRowConverter.java | 2 +- .../calcite/adapter/file/FileSchema.java | 2 +- .../calcite/adapter/file/FileTable.java | 2 +- .../calcite/adapter/file/JsonEnumerator.java | 2 +- .../adapter/file/JsonScannableTable.java | 2 +- .../calcite/adapter/file/JsonTable.java | 2 +- .../adapter/file/FileAdapterTests.java | 2 +- .../adapter/geode/rel/GeodeAggregate.java | 2 +- .../adapter/geode/rel/GeodeEnumerator.java | 2 +- .../adapter/geode/rel/GeodeFilter.java | 2 +- .../adapter/geode/rel/GeodeProject.java | 2 +- .../calcite/adapter/geode/rel/GeodeRules.java | 2 +- .../calcite/adapter/geode/rel/GeodeSort.java | 2 +- .../calcite/adapter/geode/rel/GeodeTable.java | 2 +- .../adapter/geode/rel/GeodeTableScan.java | 2 +- .../geode/rel/GeodeToEnumerableConverter.java | 2 +- .../geode/simple/GeodeSimpleEnumerator.java | 2 +- .../simple/GeodeSimpleScannableTable.java | 2 +- .../adapter/geode/util/GeodeUtils.java | 2 +- .../adapter/innodb/IndexCondition.java | 2 +- .../adapter/innodb/InnodbEnumerator.java | 2 +- .../calcite/adapter/innodb/InnodbFilter.java | 2 +- .../innodb/InnodbFilterTranslator.java | 2 +- .../calcite/adapter/innodb/InnodbProject.java | 2 +- .../calcite/adapter/innodb/InnodbSort.java | 2 +- .../adapter/innodb/InnodbTableScan.java | 2 +- .../innodb/InnodbToEnumerableConverter.java | 2 +- .../adapter/innodb/InnodbAdapterTest.java | 2 +- .../adapter/kafka/KafkaMessageEnumerator.java | 2 +- .../adapter/kafka/KafkaStreamTable.java | 2 +- .../adapter/kafka/KafkaTableFactory.java | 2 +- .../apache/calcite/linq4j/BaseQueryable.java | 2 +- .../calcite/linq4j/DefaultEnumerable.java | 9 +- .../calcite/linq4j/DefaultQueryable.java | 2 +- .../org/apache/calcite/linq4j/Enumerable.java | 3 - .../calcite/linq4j/EnumerableDefaults.java | 50 +++-- .../linq4j/EnumerableOrderedQueryable.java | 2 +- .../calcite/linq4j/EnumerableQueryable.java | 2 +- .../org/apache/calcite/linq4j/Enumerator.java | 3 - .../calcite/linq4j/ExtendedEnumerable.java | 11 +- .../calcite/linq4j/ExtendedQueryable.java | 4 +- .../org/apache/calcite/linq4j/Grouping.java | 3 - .../apache/calcite/linq4j/GroupingImpl.java | 6 +- .../org/apache/calcite/linq4j/Linq4j.java | 7 +- .../org/apache/calcite/linq4j/LookupImpl.java | 17 +- .../calcite/linq4j/MemoryEnumerator.java | 5 +- .../apache/calcite/linq4j/MemoryFactory.java | 2 +- .../calcite/linq4j/MergeUnionEnumerator.java | 13 +- .../apache/calcite/linq4j/ModularInteger.java | 2 +- .../org/apache/calcite/linq4j/Nullness.java | 44 ++--- .../java/org/apache/calcite/linq4j/Ord.java | 2 +- .../org/apache/calcite/linq4j/Queryable.java | 6 +- .../calcite/linq4j/QueryableDefaults.java | 2 +- .../calcite/linq4j/QueryableFactory.java | 7 +- .../calcite/linq4j/QueryableRecorder.java | 11 +- .../apache/calcite/linq4j/RawEnumerable.java | 3 - .../apache/calcite/linq4j/RawQueryable.java | 4 +- .../calcite/linq4j/annotations/Contract.java | 51 +++++ .../linq4j/annotations/EnsuresNonNull.java | 39 ++++ .../linq4j/annotations/EnsuresNonNullIf.java | 50 +++++ .../linq4j/annotations/MonotonicNonNull.java | 36 ++++ .../linq4j/annotations/RequiresNonNull.java | 40 ++++ .../linq4j/annotations/package-info.java | 34 ++++ .../calcite/linq4j/function/Function1.java | 3 +- .../calcite/linq4j/function/Function2.java | 3 +- .../calcite/linq4j/function/Functions.java | 12 +- .../calcite/linq4j/function/package-info.java | 3 + .../apache/calcite/linq4j/package-info.java | 8 +- .../calcite/linq4j/tree/AbstractNode.java | 2 +- .../linq4j/tree/ArrayLengthRecordField.java | 2 +- .../calcite/linq4j/tree/BinaryExpression.java | 2 +- .../calcite/linq4j/tree/BlockBuilder.java | 5 +- .../calcite/linq4j/tree/BlockStatement.java | 4 +- .../calcite/linq4j/tree/CatchBlock.java | 2 +- .../calcite/linq4j/tree/ClassDeclaration.java | 2 +- .../linq4j/tree/ClassDeclarationFinder.java | 2 +- .../linq4j/tree/ConditionalExpression.java | 2 +- .../linq4j/tree/ConditionalStatement.java | 2 +- .../linq4j/tree/ConstantExpression.java | 4 +- .../linq4j/tree/ConstantUntypedNull.java | 2 +- .../linq4j/tree/ConstructorDeclaration.java | 2 +- .../linq4j/tree/DeclarationStatement.java | 2 +- .../tree/DeterministicCodeOptimizer.java | 2 +- .../apache/calcite/linq4j/tree/Evaluator.java | 2 +- .../calcite/linq4j/tree/ExpressionType.java | 2 +- .../calcite/linq4j/tree/ExpressionWriter.java | 2 +- .../calcite/linq4j/tree/Expressions.java | 6 +- .../calcite/linq4j/tree/FieldDeclaration.java | 2 +- .../calcite/linq4j/tree/ForEachStatement.java | 2 +- .../calcite/linq4j/tree/ForStatement.java | 2 +- .../linq4j/tree/FunctionExpression.java | 2 +- .../calcite/linq4j/tree/GotoStatement.java | 2 +- .../calcite/linq4j/tree/IndexExpression.java | 2 +- .../calcite/linq4j/tree/LabelStatement.java | 2 +- .../calcite/linq4j/tree/LabelTarget.java | 2 +- .../calcite/linq4j/tree/MemberExpression.java | 2 +- .../linq4j/tree/MethodCallExpression.java | 2 +- .../linq4j/tree/MethodDeclaration.java | 2 +- .../linq4j/tree/NewArrayExpression.java | 2 +- .../calcite/linq4j/tree/NewExpression.java | 2 +- .../calcite/linq4j/tree/OptimizeShuttle.java | 2 +- .../linq4j/tree/ParameterExpression.java | 2 +- .../apache/calcite/linq4j/tree/Primitive.java | 4 +- .../calcite/linq4j/tree/PseudoField.java | 2 +- .../linq4j/tree/ReflectedPseudoField.java | 2 +- .../apache/calcite/linq4j/tree/Shuttle.java | 2 +- .../linq4j/tree/TernaryExpression.java | 2 +- .../calcite/linq4j/tree/ThrowStatement.java | 2 +- .../calcite/linq4j/tree/TryStatement.java | 2 +- .../linq4j/tree/TypeBinaryExpression.java | 2 +- .../org/apache/calcite/linq4j/tree/Types.java | 4 +- .../calcite/linq4j/tree/UnaryExpression.java | 2 +- .../calcite/linq4j/tree/UnsignedType.java | 2 +- .../calcite/linq4j/tree/VisitorImpl.java | 4 +- .../calcite/linq4j/tree/WhileStatement.java | 2 +- .../calcite/linq4j/tree/package-info.java | 3 + .../calcite/linq4j/util/Compatible.java | 2 +- .../calcite/linq4j/util/package-info.java | 3 + .../calcite/linq4j/test/BlockBuilderTest.java | 2 +- .../calcite/linq4j/test/ExpressionTest.java | 2 +- .../linq4j/test/JoinPreserveOrderTest.java | 2 +- .../calcite/linq4j/test/LimitSortTest.java | 2 +- .../linq4j/tree/IdentifierValidationTest.java | 2 +- .../adapter/mongodb/MongoAggregate.java | 2 +- .../adapter/mongodb/MongoEnumerator.java | 2 +- .../calcite/adapter/mongodb/MongoFilter.java | 2 +- .../calcite/adapter/mongodb/MongoProject.java | 2 +- .../calcite/adapter/mongodb/MongoRel.java | 2 +- .../calcite/adapter/mongodb/MongoSort.java | 2 +- .../adapter/mongodb/MongoTableScan.java | 2 +- .../mongodb/MongoToEnumerableConverter.java | 2 +- .../calcite/adapter/pig/PigTableFactory.java | 2 +- .../org/apache/calcite/piglet/PigTable.java | 2 +- .../os/AbstractBaseScannableTable.java | 2 +- .../adapter/os/CpuInfoTableFunction.java | 2 +- .../adapter/os/CpuTimeTableFunction.java | 2 +- .../calcite/adapter/os/DuTableFunction.java | 2 +- .../adapter/os/FilesTableFunction.java | 2 +- .../adapter/os/GitCommitsTableFunction.java | 2 +- .../os/InterfaceAddressesTableFunction.java | 2 +- .../os/InterfaceDetailsTableFunction.java | 2 +- .../adapter/os/JavaInfoTableFunction.java | 2 +- .../calcite/adapter/os/JpsTableFunction.java | 2 +- .../adapter/os/MemoryInfoTableFunction.java | 2 +- .../adapter/os/MountsTableFunction.java | 2 +- .../adapter/os/OsVersionTableFunction.java | 2 +- .../calcite/adapter/os/PsTableFunction.java | 2 +- .../adapter/os/StdinTableFunction.java | 2 +- .../adapter/os/SystemInfoTableFunction.java | 2 +- .../adapter/os/VmstatTableFunction.java | 2 +- .../calcite/adapter/tpcds/TpcdsSchema.java | 2 +- .../chinook/PreferredAlbumsTableFactory.java | 2 +- .../chinook/PreferredGenresTableFactory.java | 2 +- .../calcite/adapter/tpcds/TpcdsTest.java | 2 +- .../calcite/adapter/redis/RedisSchema.java | 2 +- .../calcite/adapter/redis/RedisTable.java | 2 +- .../adapter/redis/RedisTableFactory.java | 2 +- .../server/AbstractModifiableTable.java | 2 +- .../calcite/server/MaterializedViewTable.java | 4 +- .../calcite/server/MutableArrayTable.java | 4 +- .../calcite/server/ServerDdlExecutor.java | 2 +- .../apache/calcite/test/ServerParserTest.java | 2 +- .../spark/EnumerableToSparkConverter.java | 2 +- .../calcite/adapter/spark/HttpServer.java | 2 +- .../adapter/spark/JdbcToSparkConverter.java | 2 +- .../calcite/adapter/spark/SparkRules.java | 2 +- .../spark/SparkToEnumerableConverter.java | 2 +- .../calcite/adapter/splunk/SplunkDriver.java | 2 +- .../calcite/adapter/splunk/SplunkQuery.java | 2 +- .../calcite/adapter/splunk/SplunkTable.java | 2 +- .../splunk/search/SplunkConnection.java | 2 +- .../splunk/search/SplunkConnectionImpl.java | 2 +- .../calcite/sql/parser/SqlParserFixture.java | 2 +- .../sql/parser/SqlParserListFixture.java | 2 +- .../calcite/sql/parser/SqlParserTest.java | 2 +- .../calcite/sql/test/AbstractSqlTester.java | 2 +- .../calcite/sql/test/SqlOperatorFixture.java | 2 +- .../calcite/sql/test/SqlTestFactory.java | 2 +- .../apache/calcite/sql/test/SqlTester.java | 2 +- .../org/apache/calcite/sql/test/SqlTests.java | 2 +- .../calcite/test/AbstractModifiableTable.java | 2 +- .../apache/calcite/test/CalciteAssert.java | 2 +- .../apache/calcite/test/ConnectionSpec.java | 2 +- .../apache/calcite/test/DiffRepository.java | 2 +- .../org/apache/calcite/test/DiffTestCase.java | 2 +- .../apache/calcite/test/MockDdlExecutor.java | 2 +- .../calcite/test/MockRelOptPlanner.java | 2 +- .../calcite/test/MockSqlOperatorTable.java | 2 +- .../org/apache/calcite/test/QuidemTest.java | 2 +- .../test/ReflectiveSchemaWithoutRowCount.java | 2 +- .../apache/calcite/test/RelOptFixture.java | 2 +- .../calcite/test/SqlOperatorFixtureImpl.java | 2 +- .../calcite/test/SqlOperatorFixtures.java | 2 +- .../apache/calcite/test/SqlOperatorTest.java | 2 +- .../apache/calcite/test/SqlRuntimeTester.java | 2 +- .../apache/calcite/test/SqlToRelFixture.java | 2 +- .../test/catalog/MockCatalogReader.java | 2 +- .../catalog/MockCatalogReaderDynamic.java | 2 +- .../catalog/MockCatalogReaderExtended.java | 2 +- .../test/catalog/MockCatalogReaderSimple.java | 2 +- .../schemata/bookstore/BookstoreSchema.java | 2 +- .../schemata/catchall/CatchallSchema.java | 2 +- .../countries/CountriesTableFunction.java | 2 +- .../countries/StatesTableFunction.java | 2 +- .../schemata/foodmart/FoodmartSchema.java | 2 +- .../calcite/test/schemata/hr/Department.java | 2 +- .../test/schemata/hr/DepartmentPlus.java | 2 +- .../calcite/test/schemata/hr/Employee.java | 2 +- .../calcite/test/schemata/hr/Event.java | 2 +- .../test/schemata/hr/NullableTest.java | 2 +- .../orderstream/BaseOrderStreamTable.java | 2 +- .../InfiniteOrdersStreamTableFactory.java | 2 +- .../orderstream/InfiniteOrdersTable.java | 2 +- .../orderstream/OrdersHistoryTable.java | 2 +- .../orderstream/OrdersStreamTableFactory.java | 2 +- .../schemata/orderstream/OrdersTable.java | 2 +- .../schemata/orderstream/ProductsTable.java | 2 +- .../orderstream/ProductsTableFactory.java | 2 +- .../orderstream/ProductsTemporalTable.java | 2 +- .../java/org/apache/calcite/util/Smalls.java | 2 +- 1273 files changed, 2289 insertions(+), 2256 deletions(-) create mode 100644 linq4j/src/main/java/org/apache/calcite/linq4j/annotations/Contract.java create mode 100644 linq4j/src/main/java/org/apache/calcite/linq4j/annotations/EnsuresNonNull.java create mode 100644 linq4j/src/main/java/org/apache/calcite/linq4j/annotations/EnsuresNonNullIf.java create mode 100644 linq4j/src/main/java/org/apache/calcite/linq4j/annotations/MonotonicNonNull.java create mode 100644 linq4j/src/main/java/org/apache/calcite/linq4j/annotations/RequiresNonNull.java create mode 100644 linq4j/src/main/java/org/apache/calcite/linq4j/annotations/package-info.java 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..95ee7867a5b4 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; 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/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..5a4653c2fd83 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; @@ -65,7 +65,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/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/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..f24ccd973a3c 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; 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/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..bba5bdad07fe 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; 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/core/src/main/java/org/apache/calcite/DataContext.java b/core/src/main/java/org/apache/calcite/DataContext.java index eeca324268e4..82f0823ee424 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; diff --git a/core/src/main/java/org/apache/calcite/DataContexts.java b/core/src/main/java/org/apache/calcite/DataContexts.java index b7e7f3fea2b0..03d0316f711d 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; 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..a6e5820787ab 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; @@ -433,7 +433,7 @@ 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 = 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..6cf1c3489d25 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 @@ -27,8 +27,7 @@ import org.apache.calcite.rel.type.RelProtoDataType; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.sql.Date; @@ -67,7 +66,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 +201,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()]; @@ -385,7 +384,6 @@ private static long toLong(Object o) { } } - @EnsuresNonNullIf(result = true, expression = "#1") 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 0aaf1f64fe8e..f7ad7cb14447 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 @@ -65,7 +65,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; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregate.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregate.java index 0429168a8fd5..a59a345c129a 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregate.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregate.java @@ -36,7 +36,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateBase.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateBase.java index ae2f939988aa..6718af296b34 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateBase.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateBase.java @@ -47,7 +47,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java index 55474083886f..86a761686be9 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAggregateRule.java @@ -25,7 +25,7 @@ import org.apache.calcite.rel.core.AggregateCall; import org.apache.calcite.rel.logical.LogicalAggregate; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Rule to convert a {@link LogicalAggregate} to an {@link EnumerableAggregate}. diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAsofJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAsofJoin.java index d7cb7b4cdb7e..d5489bcdcd0d 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAsofJoin.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableAsofJoin.java @@ -44,7 +44,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java index 11a3620c8c2e..e595126f200e 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBatchNestedLoopJoin.java @@ -42,7 +42,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Modifier; import java.lang.reflect.Type; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java index 666e8802d415..c2b4a28fb824 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableBindable.java @@ -35,7 +35,7 @@ import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalc.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalc.java index 03cd0e419a0d..564c524dd674 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalc.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCalc.java @@ -51,7 +51,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Modifier; import java.lang.reflect.Type; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableConditionalCorrelate.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableConditionalCorrelate.java index 02b51a624926..bd3ec415c594 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableConditionalCorrelate.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableConditionalCorrelate.java @@ -38,7 +38,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Modifier; import java.lang.reflect.Type; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelate.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelate.java index e5adff42d9de..2d6004057aa8 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelate.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableCorrelate.java @@ -37,7 +37,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Modifier; import java.lang.reflect.Type; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilter.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilter.java index f4943ce8917c..46221dbf6c66 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilter.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableFilter.java @@ -32,7 +32,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java index 6fc9a9ba3d07..3ed56bfcb72c 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableHashJoin.java @@ -42,7 +42,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Method; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/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..1287d088d946 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; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java index fe65699e0c12..e4222961fbf6 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoin.java @@ -54,7 +54,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java index f78423edbde5..5078caa7c08b 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeJoinRule.java @@ -33,7 +33,7 @@ import org.apache.calcite.rex.RexUtil; import org.apache.calcite.sql.fun.SqlStdOperatorTable; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java index 545329726fb0..27f9c2925220 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableNestedLoopJoin.java @@ -39,7 +39,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Set; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java index 8b4c0c5ded53..04f13314ce47 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableProject.java @@ -31,7 +31,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRel.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRel.java index 2136b1f727ca..75ddf9ef53a8 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRel.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRel.java @@ -22,7 +22,7 @@ import org.apache.calcite.rel.PhysicalNode; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelFactories.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelFactories.java index 38adfd50a118..43501a38a6cf 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelFactories.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelFactories.java @@ -26,7 +26,7 @@ import org.apache.calcite.rex.RexUtil; import org.apache.calcite.sql.validate.SqlValidatorUtil; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Set; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java index ae380578c42b..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..5d40346879e7 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRepeatUnion.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRepeatUnion.java @@ -30,7 +30,7 @@ import org.apache.calcite.util.BuiltInMethod; import org.apache.calcite.util.Util; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSort.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSort.java index be23b6602e89..36ea8865298b 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSort.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSort.java @@ -28,7 +28,7 @@ import org.apache.calcite.util.BuiltInMethod; import org.apache.calcite.util.Pair; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** Implementation of {@link org.apache.calcite.rel.core.Sort} in * {@link org.apache.calcite.adapter.enumerable.EnumerableConvention enumerable calling convention}. */ diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortRule.java index 14a9c8671a01..d8179e524cf8 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortRule.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortRule.java @@ -21,7 +21,7 @@ import org.apache.calcite.rel.convert.ConverterRule; import org.apache.calcite.rel.core.Sort; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Rule to convert an {@link org.apache.calcite.rel.core.Sort} to an diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregate.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregate.java index 29997dd3b720..f28cf3917039 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregate.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregate.java @@ -42,7 +42,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregateRule.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregateRule.java index ffeb646a1b68..e55b18069fea 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregateRule.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableSortedAggregateRule.java @@ -25,7 +25,7 @@ import org.apache.calcite.rel.logical.LogicalAggregate; import org.apache.calcite.util.ImmutableIntList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Rule to convert a {@link LogicalAggregate} to an {@link EnumerableSortedAggregate}. diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScan.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScan.java index c9a74e8ae6cd..536b4f99b4e9 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScan.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableFunctionScan.java @@ -36,7 +36,7 @@ import org.apache.calcite.sql.validate.SqlConformanceEnum; import org.apache.calcite.sql.validate.SqlUserDefinedTableFunction; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Method; import java.lang.reflect.Type; diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModify.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModify.java index 3f60240fd994..49528837b52b 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; 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..5a0ffc62afc3 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 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 57ac8495c819..c10a2d3f2fe1 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; 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..a4f5a0d17e7b 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; 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..5243ca6da207 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; 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..84d52b62b7e2 100644 --- a/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfig.java +++ b/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfig.java @@ -22,8 +22,7 @@ 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 +60,8 @@ public interface CalciteConnectionConfig extends ConnectionConfig { /** Returns the value of {@link CalciteConnectionProperty#FUN}, * or a default operator table if not set. If {@code defaultOperatorTable} * is not null, the result is never null. */ - @PolyNull T fun(Class operatorTableClass, - @PolyNull T defaultOperatorTable); + @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 +77,13 @@ public interface CalciteConnectionConfig extends ConnectionConfig { /** Returns the value of {@link CalciteConnectionProperty#PARSER_FACTORY}, * or a default parser if not set. If {@code defaultParserFactory} * is not null, the result is never null. */ - @PolyNull T parserFactory(Class parserFactoryClass, - @PolyNull T defaultParserFactory); + @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); + @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 +94,8 @@ public interface CalciteConnectionConfig extends ConnectionConfig { /** Returns the value of {@link CalciteConnectionProperty#TYPE_SYSTEM}, * or a default type system if not set. If {@code defaultTypeSystem} * is not null, the result is never null. */ - @PolyNull T typeSystem(Class typeSystemClass, - @PolyNull T defaultTypeSystem); + @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 +116,12 @@ public interface CalciteConnectionConfig extends ConnectionConfig { /** Returns the value of {@link CalciteConnectionProperty#META_TABLE_FACTORY}, * or a default meta table factory if not set. If * {@code defaultMetaTableFactory} is not null, the result is never null. */ - @PolyNull T metaTableFactory(Class metaTableFactoryClass, - @PolyNull T defaultMetaTableFactory); + @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); + @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..e0b2cc632b05 100644 --- a/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfigImpl.java +++ b/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfigImpl.java @@ -27,8 +27,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 +105,8 @@ public boolean isSet(CalciteConnectionProperty property) { .getEnum(NullCollation.class, NullCollation.HIGH); } - @Override public @PolyNull T fun(Class operatorTableClass, - @PolyNull T defaultOperatorTable) { + @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 +152,14 @@ public boolean isSet(CalciteConnectionProperty property) { .getBoolean(lex().caseSensitive); } - @Override public @PolyNull T parserFactory(Class parserFactoryClass, - @PolyNull T defaultParserFactory) { + @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) { + @Override public @Nullable T schemaFactory(Class schemaFactoryClass, + @Nullable T defaultSchemaFactory) { return CalciteConnectionProperty.SCHEMA_FACTORY.wrap(properties) .getPlugin(schemaFactoryClass, defaultSchemaFactory); } @@ -179,8 +178,8 @@ public boolean isSet(CalciteConnectionProperty property) { .getBoolean(); } - @Override public @PolyNull T typeSystem(Class typeSystemClass, - @PolyNull T defaultTypeSystem) { + @Override public @Nullable T typeSystem(Class typeSystemClass, + @Nullable T defaultTypeSystem) { return CalciteConnectionProperty.TYPE_SYSTEM.wrap(properties) .getPlugin(typeSystemClass, defaultTypeSystem); } @@ -220,16 +219,16 @@ public boolean isSet(CalciteConnectionProperty property) { .getBoolean(); } - @Override public @PolyNull T metaTableFactory( + @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( + @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 7bae4774b0a0..69882c616487 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; 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/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..19de7be6e940 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()); } 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/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..255144a4c866 100644 --- a/core/src/main/java/org/apache/calcite/interpreter/TableFunctionScanNode.java +++ b/core/src/main/java/org/apache/calcite/interpreter/TableFunctionScanNode.java @@ -30,7 +30,7 @@ import com.google.common.collect.ImmutableList; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Interpreter node that implements a 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..b3d5a69a3f6c 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; diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteFactory.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteFactory.java index 9100da4acc09..0e4fdcb143cb 100644 --- a/core/src/main/java/org/apache/calcite/jdbc/CalciteFactory.java +++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteFactory.java @@ -21,7 +21,7 @@ import org.apache.calcite.avatica.AvaticaFactory; import org.apache.calcite.avatica.UnregisteredDriver; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Properties; diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteJdbc41Factory.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteJdbc41Factory.java index a4a2ee218228..04873007907f 100644 --- a/core/src/main/java/org/apache/calcite/jdbc/CalciteJdbc41Factory.java +++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteJdbc41Factory.java @@ -27,7 +27,7 @@ import org.apache.calcite.avatica.QueryState; import org.apache.calcite.avatica.UnregisteredDriver; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.io.InputStream; import java.io.Reader; diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaColumnFactory.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaColumnFactory.java index 1f9d1a487b9e..9972729049b7 100644 --- a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaColumnFactory.java +++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaColumnFactory.java @@ -19,7 +19,7 @@ import org.apache.calcite.avatica.MetaImpl.MetaColumn; import org.apache.calcite.schema.Table; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaColumnFactoryImpl.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaColumnFactoryImpl.java index be320626cf12..877df6a7e34d 100644 --- a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaColumnFactoryImpl.java +++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaColumnFactoryImpl.java @@ -19,7 +19,7 @@ import org.apache.calcite.avatica.MetaImpl.MetaColumn; import org.apache.calcite.schema.Table; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** Default implementation of CalciteMetaColumnFactoryImpl. */ public class CalciteMetaColumnFactoryImpl diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java index e294643fca2a..0c4d0df1c198 100644 --- a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java +++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java @@ -68,7 +68,7 @@ import com.google.common.primitives.Ints; import com.google.common.primitives.Longs; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Field; import java.sql.Connection; diff --git a/core/src/main/java/org/apache/calcite/jdbc/CalcitePrepare.java b/core/src/main/java/org/apache/calcite/jdbc/CalcitePrepare.java index ec37fd4c7a39..3c051292a7e3 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; 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 7ec17ea52f46..6ce20e268f3d 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; @@ -66,10 +68,7 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Ordering; -import org.checkerframework.checker.initialization.qual.UnknownInitialization; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.RequiresNonNull; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; @@ -137,7 +136,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; @@ -150,7 +149,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; 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..2d8fcd15af99 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; @@ -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..6ac184d177ee 100644 --- a/core/src/main/java/org/apache/calcite/materialize/MaterializationService.java +++ b/core/src/main/java/org/apache/calcite/materialize/MaterializationService.java @@ -41,7 +41,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Type; import java.util.ArrayList; diff --git a/core/src/main/java/org/apache/calcite/materialize/MutableNode.java b/core/src/main/java/org/apache/calcite/materialize/MutableNode.java index 278c946966d0..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 c30cfc2815b5..f22a6c8cb658 100644 --- a/core/src/main/java/org/apache/calcite/model/ModelHandler.java +++ b/core/src/main/java/org/apache/calcite/model/ModelHandler.java @@ -53,7 +53,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -106,7 +106,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(); 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..6cc88b8c0b99 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,9 +30,7 @@ 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; @@ -149,7 +148,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 +180,6 @@ public MetadataFactory getMetadataFactory() { */ @EnsuresNonNull("this.mqSupplier") public void setMetadataQuerySupplier( - @UnknownInitialization RelOptCluster this, Supplier mqSupplier) { this.mqSupplier = mqSupplier; } 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..166ffc81f3fa 100644 --- a/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java +++ b/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java @@ -114,10 +114,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 +2479,8 @@ 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, + public static @Nullable String toString( + final @Nullable RelNode rel, SqlExplainLevel detailLevel, boolean expand) { if (rel == null) { @@ -3584,7 +3581,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; } @@ -4541,7 +4538,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 +4553,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; } @@ -4988,7 +4984,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..22ed8943ff85 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)) 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/SubstitutionVisitor.java b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java index 5a76cb99b3e7..402f872e3b98 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; @@ -1017,7 +1017,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); 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..a563218a2027 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; 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..df28ae14d36a 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; 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..97cce4d58292 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); 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..f1b27aae74dd 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,9 @@ import org.apache.calcite.config.CalciteConnectionConfig; import org.apache.calcite.config.CalciteSystemProperty; +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 +64,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 +226,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 +280,6 @@ public void setTopDownOpt(boolean value) { ensureRootConverters(); } - @Pure @Override public @Nullable RelNode getRoot() { return root; } @@ -1503,7 +1500,7 @@ private RelSubset registerSubset( * @param plan Plan * @return Normalized plan */ - public static @PolyNull String normalizePlan(@PolyNull String plan) { + public static @Nullable String normalizePlan(@Nullable String plan) { if (plan == null) { return null; } 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..6932692982b7 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; @@ -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..f44178c8a6c8 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; 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..89a516e6b4c5 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; 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..6ce1fbd1414f 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(); } 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..6a9337c6af73 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; 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..0e38205f143c 100644 --- a/core/src/main/java/org/apache/calcite/profile/SimpleProfiler.java +++ b/core/src/main/java/org/apache/calcite/profile/SimpleProfiler.java @@ -17,6 +17,7 @@ package org.apache.calcite.profile; import org.apache.calcite.linq4j.Ord; +import org.apache.calcite.linq4j.annotations.RequiresNonNull; import org.apache.calcite.materialize.Lattice; import org.apache.calcite.rel.metadata.NullSentinel; import org.apache.calcite.runtime.FlatLists; @@ -27,9 +28,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; @@ -295,7 +294,6 @@ private boolean hasNull(ImmutableBitSet columnOrdinals) { @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 fd1bbc213aa2..4e6231bb8b85 100644 --- a/core/src/main/java/org/apache/calcite/rel/RelInput.java +++ b/core/src/main/java/org/apache/calcite/rel/RelInput.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; 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..f23c6128c489 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, 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..09bfd9a1765e 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; 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 00bc6048fe1f..215d6b0d9dae 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 4f9aa5f14a37..7f4d32871044 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 @@ -88,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; @@ -196,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); } @@ -829,7 +828,7 @@ public RexNode toRex(RelOptCluster cluster, Object o) { } @SuppressWarnings({"rawtypes", "unchecked"}) - @PolyNull RexNode toRex(RelInput relInput, @PolyNull Object o) { + @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 55886200a58d..1cf0d2d64e9a 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 @@ -44,7 +44,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..d6935607e384 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; 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..9703f76fbf74 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; 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..ee24239828bf 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; 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..a9c7d1f726fa 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 = 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..aac5f5b09daa 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<>(); 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..b7df1a707856 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(); } 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..18444466ea06 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,7 +25,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.util.concurrent.ExecutionException; @@ -64,7 +64,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 { 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/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..676263f70806 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 @@ -42,8 +42,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 +276,8 @@ private RelMdColumnOrigins() {} return set; } - private static @PolyNull Set createDerivedColumnOrigins( - @PolyNull Set inputSet) { + private static @Nullable Set createDerivedColumnOrigins( + @Nullable Set inputSet) { if (inputSet == null) { return null; } 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..8fb570305b8c 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 @@ -58,7 +58,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; 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..66b56cad6cac 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 @@ -27,8 +27,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,9 +234,9 @@ 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) { + private static @Nullable Double quotientForPercentage( + @Nullable Double numerator, + @Nullable Double denominator) { if ((numerator == null) || (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..b2330bff7718 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; 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..baf9c6d5cdea 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 @@ -49,8 +49,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 +314,9 @@ 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) { + public static @Nullable Double numDistinctVals( + @Nullable Double domainSize, + @Nullable Double numSelected) { if ((domainSize == null) || (numSelected == null)) { return domainSize; } @@ -911,7 +910,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 +1080,7 @@ 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) { + public static @Nullable Double validatePercentage(@Nullable Double result) { assert isPercentage(result, true); return result; } @@ -1117,7 +1116,7 @@ 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) { + 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..f4cc78fea47b 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,7 +21,7 @@ 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; 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..a4ac28ccc047 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 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..2d0f8c56b231 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 = 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 ca7f5efe4db1..8b20523de493 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; @@ -2309,7 +2308,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()) { @@ -2419,8 +2417,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; } @@ -2449,7 +2446,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; @@ -2477,7 +2474,7 @@ 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; @@ -2510,7 +2507,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..d0e1a86bab03 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; 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..f054c66b8ced 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; @@ -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..d25b579de7f0 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; 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/HyperGraph.java b/core/src/main/java/org/apache/calcite/rel/rules/HyperGraph.java index 3e785a19bdfe..3f4e720be48b 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; 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/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..ec34f6e619d1 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; 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..979dff18ffd4 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. @@ -448,7 +446,6 @@ public void setJoinRemovalSemiJoin(int dimIdx, LogicalJoin semiJoin) { */ @RequiresNonNull({"joinStart", "nFieldsInJoinFactor"}) ImmutableBitSet getJoinFilterFactorBitmap( - @UnderInitialization LoptMultiJoin this, RexNode joinFilter, boolean setFields) { ImmutableBitSet fieldRefBitmap = fieldBitmap(joinFilter); @@ -470,8 +467,7 @@ private static ImmutableBitSet fieldBitmap(RexNode joinFilter) { * 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(); @@ -497,7 +493,6 @@ private void setJoinFilterRefs( */ @RequiresNonNull({"joinStart", "nFieldsInJoinFactor"}) private ImmutableBitSet factorBitmap( - @UnknownInitialization LoptMultiJoin this, ImmutableBitSet fieldRefBitmap) { ImmutableBitSet.Builder factorRefBitmap = ImmutableBitSet.builder(); for (int field : fieldRefBitmap) { @@ -516,7 +511,6 @@ private ImmutableBitSet factorBitmap( */ @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..f3cd00bd2385 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,15 +307,15 @@ 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]; + int leftFactor = factors[i]; + int rightFactor = factors[j]; if (simpleFactors.get(leftFactor).getQualifiedName().equals( simpleFactors.get(rightFactor).getQualifiedName())) { selfJoinPairs.put(leftFactor, rightFactor); 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/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/PushProjector.java b/core/src/main/java/org/apache/calcite/rel/rules/PushProjector.java index 9dc5172896cb..2bbcb54235b5 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; 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..3fc1a6fcd614 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; 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..20215f7796f5 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; 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/RexBiVisitorImpl.java b/core/src/main/java/org/apache/calcite/rex/RexBiVisitorImpl.java index 0c8f220bff29..1ae39484bfc9 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,7 @@ * @param Return type from each {@code visitXxx} method * @param

Payload type */ -public class RexBiVisitorImpl<@Nullable R, P> implements RexBiVisitor { +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..e002c84a7821 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexBuilder.java +++ b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java @@ -67,8 +67,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 +137,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 +2395,7 @@ 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) { + 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..3af137e0a6cd 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() 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..ee576085f73b 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; 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..10269b5729f2 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; 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..da42d57aca43 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; 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..98f50214fe35 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; 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..fae0c4184b93 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; 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..092154f91b7f 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLambdaRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLambdaRef.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; 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..98a9179fefde 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.RequiresNonNull; 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; @@ -280,7 +277,6 @@ public class RexLiteral extends RexNode { */ @RequiresNonNull({"typeName", "type"}) public final String computeDigest( - @UnknownInitialization RexLiteral this, RexDigestIncludeType includeType) { if (includeType == RexDigestIncludeType.OPTIONAL) { if (digest != null) { @@ -307,8 +303,7 @@ public final String computeDigest( * @return whether {@link RexDigestIncludeType} digest would include data type */ @RequiresNonNull("type") - RexDigestIncludeType digestIncludesType( - @UnknownInitialization RexLiteral this) { + RexDigestIncludeType digestIncludesType() { return shouldIncludeType(value, type); } @@ -825,10 +820,10 @@ 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( + public static @Nullable RexLiteral fromJdbcString( RelDataType type, SqlTypeName typeName, - @PolyNull String literal) { + @Nullable String literal) { if (literal == null) { return null; } @@ -967,7 +962,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) { 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..d6a337389435 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; 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..47252a1cde5a 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; 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..5d8e9b86fb85 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; 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..f84f0d8dbe8b 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; 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..4770ae40b460 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; 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..f90ab5010583 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); 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..74b109cfeb05 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, 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..8d2a06bc3bd5 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; 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..f1c3531c6bb8 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexShuttle.java +++ b/core/src/main/java/org/apache/calcite/rex/RexShuttle.java @@ -20,8 +20,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.List; @@ -277,7 +276,7 @@ protected List visitFieldCollations( * *

Returns null if and only if {@code exprList} is null. */ - public final @PolyNull List apply(@PolyNull List exprList) { + public final @Nullable List apply(@Nullable List exprList) { if (exprList == null) { return exprList; } @@ -293,7 +292,7 @@ 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) { + 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 98fbbb781b9e..d375e404dc86 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; @@ -3418,7 +3418,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; 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..9bf31c32bffe 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; 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..51adef917eca 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; 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..b262194ca624 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; 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..2bfb5972b66a 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,7 @@ * * @param Return type from each {@code visitXxx} method. */ -public class RexVisitorImpl<@Nullable R> implements RexVisitor { +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..9489dc5ecde3 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; } 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..7ae667b73666 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; 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..5d4914c49d83 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; @@ -115,7 +114,7 @@ private ConsList(E first, List rest) { return toList().listIterator(index); } - @Override public @PolyNull Object[] toArray(ConsList<@PolyNull E> this) { + @Override public @Nullable Object[] toArray(ConsList<@Nullable E> this) { return toList().toArray(); } 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..a552342071cd 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,8 @@ 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.NonNull; +import org.jspecify.annotations.Nullable; import java.util.AbstractList; import java.util.ArrayList; @@ -263,7 +262,7 @@ private static ComparableList of_(List t) { } /** 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 +274,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); @@ -407,7 +406,7 @@ protected static class Flat1List return a; } - @Override public @PolyNull Object[] toArray(Flat1List<@PolyNull T> this) { + @Override public @Nullable Object[] toArray(Flat1List<@Nullable T> this) { return new Object[] {castNonNull(t0)}; } @@ -540,7 +539,7 @@ protected static class Flat2List return a; } - @Override public @PolyNull Object[] toArray(Flat2List<@PolyNull T> this) { + @Override public @Nullable Object[] toArray(Flat2List<@Nullable T> this) { return new Object[] {castNonNull(t0), castNonNull(t1)}; } @@ -690,7 +689,7 @@ protected static class Flat3List return a; } - @Override public @PolyNull Object[] toArray(Flat3List<@PolyNull T> this) { + @Override public @Nullable Object[] toArray(Flat3List<@Nullable T> this) { return new Object[] {castNonNull(t0), castNonNull(t1), castNonNull(t2)}; } @@ -859,7 +858,7 @@ protected static class Flat4List return a; } - @Override public @PolyNull Object[] toArray(Flat4List<@PolyNull T> this) { + @Override public @Nullable Object[] toArray(Flat4List<@Nullable T> this) { return new Object[] {castNonNull(t0), castNonNull(t1), castNonNull(t2), castNonNull(t3)}; } @@ -1048,7 +1047,7 @@ protected static class Flat5List return a; } - @Override public @PolyNull Object[] toArray(Flat5List<@PolyNull T> this) { + @Override public @Nullable Object[] toArray(Flat5List<@Nullable T> this) { return new Object[] {castNonNull(t0), castNonNull(t1), castNonNull(t2), castNonNull(t3), castNonNull(t4)}; } @@ -1257,7 +1256,7 @@ protected static class Flat6List return a; } - @Override public @PolyNull Object[] toArray(Flat6List<@PolyNull T> this) { + @Override public @Nullable Object[] toArray(Flat6List<@Nullable T> this) { return new Object[] {castNonNull(t0), castNonNull(t1), castNonNull(t2), castNonNull(t3), castNonNull(t4), castNonNull(t5)}; } 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/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..97c44108bc78 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; @@ -63,7 +61,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. 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..5bb16adf62fa 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; @@ -901,7 +901,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 +966,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..1021d76b5ac5 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; 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..347a6887dc12 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; 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..a1d0275e3421 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,7 +39,8 @@ * @param First type * @param Second type */ -public interface PairList extends List> { +public interface PairList + extends List> { /** Creates an empty PairList. */ static PairList of() { return new PairLists.MutablePairList<>(new ArrayList<>()); @@ -187,6 +188,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..1e5fb9196c97 100644 --- a/core/src/main/java/org/apache/calcite/runtime/PairLists.java +++ b/core/src/main/java/org/apache/calcite/runtime/PairLists.java @@ -22,8 +22,8 @@ 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; 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..637debfe8ab6 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.jspecify.annotations.Nullable; +import org.apache.calcite.linq4j.annotations.RequiresNonNull; 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(); @@ -626,9 +624,7 @@ protected Prop(PropertyAccessor accessor, Method method) { } @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 +771,7 @@ 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) { + public @Nullable String get(@Nullable String defaultValue) { return accessor.stringValue(this, defaultValue); } @@ -800,7 +796,7 @@ 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); + @Nullable String stringValue(StringProp p, @Nullable String defaultValue); boolean booleanValue(BooleanProp p); boolean booleanValue(BooleanProp p, boolean defaultValue); double doubleValue(DoubleProp p); @@ -829,8 +825,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) { return defaultValue; } @@ -1143,8 +1139,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..8a0a08033b11 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; 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..db7f0189e9b6 100644 --- a/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java +++ b/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java @@ -73,13 +73,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; @@ -251,7 +250,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<>(); @@ -2793,45 +2793,45 @@ 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + public static @Nullable Object plusAny(@Nullable Object b0, + @Nullable Object b1) { if (b0 == null || b1 == null) { return castNonNull(null); } @@ -2843,25 +2843,25 @@ public static int plus(int b0, int b1) { throw notArithmetic("+", b0, b1); } - public static @PolyNull UByte plus(@PolyNull UByte b0, @PolyNull UByte b1) { + 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) { + 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) { + 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) { + public static @Nullable ULong plus(@Nullable ULong b0, @Nullable ULong b1) { return (b0 == null || b1 == null) ? castNonNull(null) : b0.add(b1); @@ -2926,51 +2926,51 @@ 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + public static @Nullable Object minusAny(@Nullable Object b0, @Nullable Object b1) { if (b0 == null || b1 == null) { return castNonNull(null); } @@ -2982,20 +2982,20 @@ public static int minus(int b0, int b1) { throw notArithmetic("-", b0, b1); } - public static @PolyNull UByte minus(@PolyNull UByte b0, @PolyNull UByte b1) { + 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) { + 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) { + 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) { + public static @Nullable ULong minus(@Nullable ULong b0, @Nullable ULong b1) { return (b0 == null || b1 == null) ? castNonNull(null) : b0.subtract(b1); @@ -3076,39 +3076,39 @@ 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + 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 +3116,8 @@ 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) { + public static @Nullable Object divideAny(@Nullable Object b0, + @Nullable Object b1) { if (b0 == null || b1 == null) { return castNonNull(null); } @@ -3139,26 +3139,26 @@ 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) { + 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) { + 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) { + 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) { + 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 +3230,42 @@ 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + 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) { + public static @Nullable ULong multiply(@Nullable ULong b0, + @Nullable ULong b1) { if (b0 == null || b1 == null) { return castNonNull(null); } @@ -3274,29 +3274,29 @@ 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) { + 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) { + 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) { + 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) { + public static @Nullable Object multiplyAny(@Nullable Object b0, + @Nullable Object b1) { if (b0 == null || b1 == null) { return castNonNull(null); } @@ -5381,7 +5381,7 @@ 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) { + public static @Nullable Integer toIntOptional(java.sql.@Nullable Date v) { return v == null ? castNonNull(null) : toInt(v); @@ -5394,7 +5394,7 @@ 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, + public static @Nullable Integer toIntOptional(java.sql.@Nullable Date v, TimeZone timeZone) { return v == null ? castNonNull(null) @@ -5422,7 +5422,7 @@ 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) { + public static @Nullable Integer toIntOptional(java.sql.@Nullable Time v) { return v == null ? castNonNull(null) : toInt(v); } @@ -5443,7 +5443,7 @@ public static int toInt(Object o) { : (Integer) cannotConvert(o, int.class); } - public static @PolyNull Integer toIntOptional(@PolyNull Object o) { + public static @Nullable Integer toIntOptional(@Nullable Object o) { return o == null ? castNonNull(null) : toInt(o); } @@ -5508,7 +5508,7 @@ 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) { + public static @Nullable Long toLongOptional(@Nullable Timestamp v) { return v == null ? castNonNull(null) : toLong(v, LOCAL_TZ); } @@ -5519,7 +5519,7 @@ public static long toLong(Timestamp v, TimeZone timeZone) { * * @see #toLong(Timestamp, TimeZone) */ - public static @PolyNull Long toLongOptional(@PolyNull Timestamp v, + public static @Nullable Long toLongOptional(@Nullable Timestamp v, TimeZone timeZone) { if (v == null) { return castNonNull(null); @@ -5549,7 +5549,7 @@ public static long toLong(Object o) { : (Long) cannotConvert(o, long.class); } - public static @PolyNull Long toLongOptional(@PolyNull Object o) { + public static @Nullable Long toLongOptional(@Nullable Object o) { return o == null ? castNonNull(null) : toLong(o); } @@ -5646,7 +5646,7 @@ 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) { + public static java.sql.@Nullable Date internalToDate(@Nullable Integer v) { return v == null ? castNonNull(null) : internalToDate(v.intValue()); } @@ -5670,11 +5670,11 @@ 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) { + 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) { + public static @Nullable Integer toTimeWithLocalTimeZone(@Nullable String v) { if (v == null) { return castNonNull(null); } @@ -5684,7 +5684,7 @@ public static java.sql.Time internalToTime(int v) { .getMillisOfDay(); } - public static @PolyNull Integer toTimeWithLocalTimeZone(@PolyNull String v, + public static @Nullable Integer toTimeWithLocalTimeZone(@Nullable String v, TimeZone timeZone) { if (v == null) { return castNonNull(null); @@ -6049,7 +6049,7 @@ 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) { + public static java.sql.@Nullable Timestamp internalToTimestamp(@Nullable Long v) { return v == null ? castNonNull(null) : internalToTimestamp(v.longValue()); } @@ -6332,7 +6332,7 @@ public static int time(long timestampMillis, String timeZone) { / (1000L * 1000L)); // milli > micro > nano } - public static @PolyNull Long toTimestampWithLocalTimeZone(@PolyNull String v) { + public static @Nullable Long toTimestampWithLocalTimeZone(@Nullable String v) { if (v == null) { return castNonNull(null); } @@ -6342,7 +6342,7 @@ public static int time(long timestampMillis, String timeZone) { .getMillisSinceEpoch(); } - public static @PolyNull Long toTimestampWithLocalTimeZone(@PolyNull String v, + public static @Nullable Long toTimestampWithLocalTimeZone(@Nullable String v, TimeZone timeZone) { if (v == null) { return castNonNull(null); @@ -6356,7 +6356,7 @@ 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) { + public static @Nullable String truncate(@Nullable String s, int maxLength) { if (s == null) { return s; } else if (s.length() > maxLength) { @@ -6367,7 +6367,7 @@ public static int time(long timestampMillis, String timeZone) { } /** Helper for CAST(... AS CHAR(maxLength)). */ - public static @PolyNull String truncateOrPad(@PolyNull String s, int maxLength) { + public static @Nullable String truncateOrPad(@Nullable String s, int maxLength) { if (s == null) { return s; } else { @@ -6380,7 +6380,7 @@ public static int time(long timestampMillis, String timeZone) { } } - public static @PolyNull ByteString stringToBinary(@PolyNull String s, Charset charset) { + public static @Nullable ByteString stringToBinary(@Nullable String s, Charset charset) { if (s == null) { return null; } else { @@ -6388,7 +6388,7 @@ public static int time(long timestampMillis, String timeZone) { } } - public static @PolyNull ByteString byteArrayToByteString(byte @PolyNull [] bytes) { + public static @Nullable ByteString byteArrayToByteString(byte @Nullable [] bytes) { if (bytes == null) { return null; } else { @@ -6396,7 +6396,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 +6405,7 @@ public static int time(long timestampMillis, String timeZone) { } /** Helper for CAST(... AS VARBINARY(maxLength)). */ - public static @PolyNull ByteString truncate(@PolyNull ByteString s, int maxLength) { + public static @Nullable ByteString truncate(@Nullable ByteString s, int maxLength) { if (s == null) { return s; } else if (s.length() > maxLength) { @@ -6416,7 +6416,7 @@ public static int time(long timestampMillis, String timeZone) { } /** Helper for CAST(... AS BINARY(maxLength)). */ - public static @PolyNull ByteString truncateOrPad(@PolyNull ByteString s, int maxLength) { + public static @Nullable ByteString truncateOrPad(@Nullable ByteString s, int maxLength) { if (s == null) { return s; } else { @@ -7030,12 +7030,12 @@ public static boolean isNotFalse(@Nullable Boolean b) { } /** NULL → NULL, FALSE → TRUE, TRUE → FALSE. */ - public static @PolyNull Boolean not(@PolyNull Boolean b) { + 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) { + public static @Nullable List arrayToList(final java.sql.@Nullable Array a) { if (a == null) { return castNonNull(null); } @@ -7090,7 +7090,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 +7142,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 +7156,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; 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..186630240add 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; 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/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..01af35095ee4 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; } 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..3bdf92e31e01 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; 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..7ad2ce061c49 100755 --- a/core/src/main/java/org/apache/calcite/sql/SqlCall.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlCall.java @@ -27,8 +27,7 @@ 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; @@ -76,7 +75,6 @@ public void setOperand(int i, @Nullable SqlNode operand) { return getOperator().getKind(); } - @Pure public abstract SqlOperator getOperator(); /** @@ -245,7 +243,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..db1e05122d16 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; 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..eb149f2ba339 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 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..a55b133a4e84 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; @@ -324,7 +323,6 @@ public SqlIdentifier skipLast(int n) { 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..c07ca28b47f9 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; 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..666bb8055899 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); 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..338652fe4faf 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, 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..c35806ad67cd 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; 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..443393a14ec2 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); } @@ -181,14 +181,14 @@ 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") + @SuppressWarnings("NullAway") @Override public @Nullable T[] toArray(T @Nullable [] a) { return list.toArray(a); } 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..b1edc4e57f54 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlOperator.java @@ -41,8 +41,7 @@ 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; @@ -247,7 +246,6 @@ public SqlIdentifier getNameAsId() { return new SqlIdentifier(getName(), SqlParserPos.ZERO); } - @Pure public SqlKind getKind() { return kind; } @@ -875,7 +873,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; } @@ -1032,7 +1029,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/SqlPivot.java b/core/src/main/java/org/apache/calcite/sql/SqlPivot.java index 2d0f3652de10..00c50f883aef 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) { 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..4dbce066e598 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; 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..09de8dd059af 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, 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..d99815a0c62e 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) { 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..48049342ace6 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlUtil.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlUtil.java @@ -56,8 +56,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 +714,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 +1130,7 @@ 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) { + public static @Nullable SqlNode stripAs(@Nullable SqlNode node) { if (node != null && node.getKind() == SqlKind.AS) { return ((SqlCall) node).operand(0); } 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..f960fe856300 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, 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..5e945d2066aa 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,7 +32,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.List; @@ -79,7 +79,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), 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/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/SqlConvertFunction.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlConvertFunction.java index a57e59aa908c..c0a23611a23a 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; 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/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..dc127ebc18c4 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; 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..c2abcdc30942 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; 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..61c994caff98 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; 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..ca47e878b6ff 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; 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..c4912279d27a 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) { 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 c62fd5804562..507325349d62 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; } 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..8156b286e2e8 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,7 @@ * * @param Return type */ -public class SqlBasicVisitor<@Nullable R> implements SqlVisitor { +public class SqlBasicVisitor implements SqlVisitor { //~ Methods ---------------------------------------------------------------- @Override public R visit(SqlLiteral literal) { @@ -77,7 +77,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,7 +102,7 @@ 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") 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/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/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..2b1f51e9598f 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; 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..f00939874d3b 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; 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..8cbbe69db3cb 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); 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 5e64b9783c06..b924408e4794 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..53c537bab8c5 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; 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..6d54c876b25f 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; 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 129fd91252f7..a9e3345ac9ef 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,7 @@ package org.apache.calcite.sql.validate; import org.apache.calcite.linq4j.Ord; +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 +133,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; @@ -344,7 +340,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 +374,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; } @@ -1820,8 +1813,8 @@ && 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, + protected @Nullable SqlNode performUnconditionalRewrites( + @Nullable SqlNode node, boolean underFrom) { if (node == null) { return null; @@ -6361,8 +6354,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. @@ -8881,7 +8874,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); @@ -8906,7 +8899,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(); 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..8e4efe31b850 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(); /** 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..cd5ff191a194 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; @@ -246,10 +246,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..6d77076484d6 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; 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..1e2e2cc90316 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/ReflectiveConvertletTable.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/ReflectiveConvertletTable.java @@ -16,15 +16,14 @@ */ package org.apache.calcite.sql2rel; +import org.apache.calcite.linq4j.annotations.RequiresNonNull; import org.apache.calcite.rex.RexNode; import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlNode; 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; @@ -66,7 +65,6 @@ public ReflectiveConvertletTable() { */ @RequiresNonNull("map") private void registerNodeTypeMethod( - @UnderInitialization ReflectiveConvertletTable this, final Method method) { if (!isPublic(method)) { return; @@ -90,7 +88,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, @@ -109,7 +107,6 @@ private void registerNodeTypeMethod( */ @RequiresNonNull("map") private void registerOpTypeMethod( - @UnderInitialization ReflectiveConvertletTable this, final Method method) { if (!isPublic(method)) { return; @@ -137,7 +134,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 +189,6 @@ private void registerOpTypeMethod( * @param convertlet Convertlet */ protected void registerOp( - @UnderInitialization ReflectiveConvertletTable this, SqlOperator op, SqlRexConvertlet convertlet) { map.put(op, convertlet); } @@ -204,7 +200,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..68f14f2701e7 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", 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 ae095af32dc8..2861c3b27db5 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/RelStructuredTypeFlattener.java @@ -87,8 +87,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; @@ -1072,7 +1071,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 d5cdb29ade13..39270dddb5c7 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; @@ -4636,7 +4636,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 +4682,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); } 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..fa0a8966122f 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; 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..8a356136796f 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; 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..1bec8d98139c 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; 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..390efb81ee01 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; 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..148eae85f575 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); } 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..bc305a62c287 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; 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..2124562bba5c 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; 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..49427ff66d3b 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)) 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..6fe64eeba65d 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; 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..3ae906b0cbc6 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; 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/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..5885bfd5c24e 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,7 @@ */ package org.apache.calcite.util; -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.math.BigInteger; @@ -93,7 +92,7 @@ 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, + public static @Nullable BigDecimal rescaleBigDecimal(@Nullable BigDecimal bd, int scale) { if (bd != null) { bd = bd.setScale(scale, RoundingMode.HALF_UP); @@ -108,7 +107,7 @@ 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) { + public static @Nullable BigDecimal toBigDecimal(@Nullable Number number) { if (number == null) { return castNonNull(null); } @@ -146,7 +145,7 @@ 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) { + public static @Nullable Double add(@Nullable Double a, @Nullable Double b) { if (a == null || b == null) { return null; } @@ -156,7 +155,7 @@ 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) { + public static @Nullable Double subtract(@Nullable Double a, @Nullable Double b) { if (a == null || b == null) { return castNonNull(null); } @@ -176,7 +175,7 @@ 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) { + public static @Nullable Double multiply(@Nullable Double a, @Nullable Double b) { if (a == null || b == null) { return castNonNull(null); } @@ -188,7 +187,7 @@ 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) { + public static @Nullable Double min(@Nullable Double a, @Nullable Double b) { if (a == null) { return b; } else if (b == null) { @@ -201,7 +200,7 @@ 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) { + 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..c640c52d5e0c 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,7 +43,7 @@ * @param Left-hand type * @param Right-hand type */ -@SuppressWarnings("type.argument.type.incompatible") +@SuppressWarnings("NullAway") public class Pair implements Comparable>, Map.Entry, Serializable { @@ -82,7 +82,8 @@ 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); } 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..f93c97b273ec 100644 --- a/core/src/main/java/org/apache/calcite/util/Permutation.java +++ b/core/src/main/java/org/apache/calcite/util/Permutation.java @@ -16,14 +16,13 @@ */ package org.apache.calcite.util; +import org.apache.calcite.linq4j.annotations.RequiresNonNull; import org.apache.calcite.util.mapping.IntPair; import org.apache.calcite.util.mapping.Mapping; 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 +45,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]; @@ -437,7 +436,7 @@ private void setInternal(int source, int target) { * @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..000c20b8922f 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,7 @@ */ package org.apache.calcite.util; -import org.checkerframework.checker.nullness.qual.PolyNull; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.io.ObjectInputStream; @@ -91,7 +91,7 @@ public Charset getCharset() { * @param charset Character set to wrap, or null * @return Wrapped charset */ - public static @PolyNull SerializableCharset forCharset(@PolyNull Charset charset) { + 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..33a90e2e71d5 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; 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..9446c8d2fd25 100644 --- a/core/src/main/java/org/apache/calcite/util/Util.java +++ b/core/src/main/java/org/apache/calcite/util/Util.java @@ -43,9 +43,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; @@ -684,7 +682,7 @@ 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, + 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; @@ -1865,8 +1863,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 +2125,7 @@ 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) { + public static @Nullable T first(@Nullable T v0, @Nullable T v1) { return v0 != null ? v0 : v1; } @@ -2576,7 +2574,7 @@ public static Map asIndexMapJ( } }; return new AbstractMap() { - @SuppressWarnings("override.return.invalid") + @SuppressWarnings("NullAway") @Override public Set> entrySet() { return entrySet; } @@ -2746,7 +2744,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 +2758,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 +2772,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 +2785,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 +2885,6 @@ public FoundOne(@Nullable Object node) { this.node = node; } - @Pure public @Nullable Object getNode() { return node; } @@ -3003,7 +3004,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/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..d55298a8fc2c 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; @@ -45,10 +43,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 +95,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 +160,7 @@ protected final VertexInfo getVertex(V vertex) { return outRemoved; } - @SuppressWarnings("return.type.incompatible") @Override public Set vertexSet() { - // Set -> Set return vertexMap.keySet(); } @@ -194,7 +190,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; 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 0fe768c242e5..c10a17dfca14 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 b09f299f8493..e1da1ab48792 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 0dbbcd9cdec9..9b05e098d82c 100644 --- a/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java +++ b/core/src/test/java/org/apache/calcite/rex/RexProgramTest.java @@ -58,8 +58,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..97060ffbad33 100644 --- a/core/src/test/java/org/apache/calcite/test/LintTest.java +++ b/core/src/test/java/org/apache/calcite/test/LintTest.java @@ -27,12 +27,15 @@ 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; +import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.ArrayList; import java.util.Comparator; import java.util.HashSet; @@ -66,6 +69,12 @@ class LintTest { compile("^(\\[CALCITE-[0-9]{1,4}][ ]).*"); private static final Pattern PATTERN = compile("^ *(// )?"); + private static final String PACKAGE_INFO = "package-info.java"; + /** Source roots that NullAway verifies; see {@code nullawayProjects} in the root + * {@code build.gradle.kts}. */ + private static final List NULL_MARKED_ROOTS = + ImmutableList.of("linq4j/src/main/java/", "core/src/main/java/"); + private static final Pattern COMMONS_LANG3_IMPORT_PATTERN = compile("^\\s*import\\s+(static\\s+)?" + "org\\.apache\\.commons\\.lang3\\..*;\\s*$"); @@ -364,6 +373,65 @@ private static boolean isJava(String filename) { assertThat(g.messages, empty()); } + /** Fails when a main-source package is not declared {@code @NullMarked}. + * + *

NullAway analyzes {@code @NullMarked} code only, so a package that forgets the + * annotation is silently skipped rather than reported. Add a {@code package-info.java} + * to the new package, copying the {@code @NullMarked} declaration from a sibling + * package. + * + *

Only the main sources of the modules that NullAway verifies are checked. Marking a + * package that nobody verifies would claim a guarantee that nothing backs. Widen + * {@link #NULL_MARKED_ROOTS} together with {@code nullawayProjects}. + * + *

A package that spans both modules needs only one {@code package-info.java}, in + * either of them, because a second one would put a duplicate class on the classpath. */ + @Test void testLintNullMarked() throws IOException { + assumeTrue(TestUnsafe.haveGit(), "Invalid git environment"); + + final List messages = new ArrayList<>(); + final Set mainPackages = new HashSet<>(); + final Set markedPackages = new HashSet<>(); + for (File file : TestUnsafe.getJavaFiles()) { + final String path = file.getPath().replace(File.separatorChar, '/'); + final String root = + NULL_MARKED_ROOTS.stream() + .filter(path::contains) + .findFirst() + .orElse(null); + if (root == null) { + continue; + } + final int i = path.indexOf(root) + root.length(); + final String packageName = + path.substring(i, path.lastIndexOf('/')).replace('/', '.'); + mainPackages.add(packageName); + if (file.getName().equals(PACKAGE_INFO)) { + if (isNullMarked(file)) { + markedPackages.add(packageName); + } else { + messages.add(file + ": " + PACKAGE_INFO + " is not annotated @NullMarked"); + } + } + } + mainPackages.stream() + .filter(packageName -> !markedPackages.contains(packageName)) + .map(packageName -> + packageName + ": package has no " + PACKAGE_INFO + " declaring @NullMarked") + .sorted() + .forEach(messages::add); + + messages.forEach(System.out::println); + assertThat(messages, empty()); + } + + private static boolean isNullMarked(File file) throws IOException { + try (Stream lines = + Files.lines(file.toPath(), StandardCharsets.UTF_8)) { + return lines.anyMatch(line -> line.startsWith("@NullMarked")); + } + } + /** Tests that the most recent N commit messages are good. * *

N needs to be large enough to verify multi-commit PRs, but not so large 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 8b75a495b768..0c7f7d0997e2 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java @@ -64,7 +64,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 6390c8ca7e08..efa682c35299 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/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..dedadefd60ab 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; 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..e8ed7c33baae 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; 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..2d89420a13ee 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; 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..814b716c1cf7 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; 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..67f725f14d1b 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; 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..925cab5d7b85 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; 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..b4174ab1e642 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; 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..6d9e6e21a150 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; 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/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..28d2783735ac 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; 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..123024980279 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; 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 40bb0f627d29..10d8e83bce22 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; 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..9a0baac8c5ec 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; 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/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/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/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/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/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/src/main/java/org/apache/calcite/adapter/file/CsvEnumerator.java b/file/src/main/java/org/apache/calcite/adapter/file/CsvEnumerator.java index 99951e85cdbe..f54e4202da6a 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; 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..78ada9185ab1 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,7 +27,7 @@ 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; 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..638393326cfa 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,8 +18,8 @@ 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; 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..71caff6057a2 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; 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..632dceac5e08 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; 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..94bb6362f6a7 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; 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..ef8616bc1cbd 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,7 +28,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.util.List; 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..b3a2aba3acff 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; 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 ed66bfff306d..5bae6f3b295b 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.io.InputStream; import java.util.ArrayList; 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/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/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..0b9041087618 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; 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..93e28a3013c6 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; 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..b1cf8f5ac6b2 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; 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/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/GeodeSort.java b/geode/src/main/java/org/apache/calcite/adapter/geode/rel/GeodeSort.java index c9b33252d980..fa150e978a26 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; 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..83075a7db007 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; 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/simple/GeodeSimpleEnumerator.java b/geode/src/main/java/org/apache/calcite/adapter/geode/simple/GeodeSimpleEnumerator.java index 6e24e71ef32d..341edf72b72e 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,7 +22,7 @@ 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; 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/util/GeodeUtils.java b/geode/src/main/java/org/apache/calcite/adapter/geode/util/GeodeUtils.java index 2aa212dc5a92..b9066de66b7a 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; 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..2d27d9a474d5 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; 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..59e5332dfaa0 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; 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/InnodbSort.java b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbSort.java index 44fa6da3fe8f..f3a01c2d1bdb 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; 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/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/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/KafkaStreamTable.java b/kafka/src/main/java/org/apache/calcite/adapter/kafka/KafkaStreamTable.java index f73941c9418a..8a3954b3a532 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,7 +39,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.Properties; 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..efeb20aba260 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; 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..eccd6ab38e96 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; @@ -97,8 +96,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 +198,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); } 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..d60bba500bf1 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; 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..b8afb58cb21e 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Enumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Enumerable.java @@ -16,8 +16,6 @@ */ package org.apache.calcite.linq4j; -import org.checkerframework.framework.qual.Covariant; - /** * Exposes the enumerator, which supports a simple iteration over a collection. * @@ -28,7 +26,6 @@ * * @param Element type */ -@Covariant(0) public interface Enumerable extends RawEnumerable, Iterable, ExtendedEnumerable { /** 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..05c9c40e2601 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; @@ -417,10 +413,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 +565,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); @@ -1168,7 +1164,7 @@ private static 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 +1193,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 +1247,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 +1289,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 +1334,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 +1525,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 +2232,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); } @@ -2482,7 +2478,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; @@ -3283,12 +3279,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") + @SuppressWarnings("NullAway") List l = map.get(lastKey); if (l.size() == 1) { map.remove(lastKey); @@ -4806,8 +4802,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 +4873,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,12 +4905,11 @@ 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); } @@ -4924,7 +4918,7 @@ private Wrapped wrap(K 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); } @@ -5010,7 +5004,7 @@ private static class MergeJoinEnumerator leftEnumerable, Enumerable rightEnumerable, Function1 outerKeySelector, 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..0c777684556d 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; 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..bd9e28be31fc 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Enumerator.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Enumerator.java @@ -16,8 +16,6 @@ */ package org.apache.calcite.linq4j; -import org.checkerframework.framework.qual.Covariant; - /** * Supports a simple iteration over a collection. * @@ -28,7 +26,6 @@ * * @param Element type */ -@Covariant(0) 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..c4dde33c2fc0 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java @@ -34,9 +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.checkerframework.framework.qual.Covariant; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.Collection; @@ -49,7 +47,6 @@ * * @param Element type */ -@Covariant(0) public interface ExtendedEnumerable { /** @@ -76,8 +73,8 @@ 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); + @Nullable TAccumulate aggregate(@Nullable TAccumulate seed, + Function2<@Nullable TAccumulate, TSource, @Nullable TAccumulate> func); /** * Applies an accumulator function over a @@ -280,7 +277,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 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..d9716d8d76ed 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 { /** 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..b531f73fde04 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; @@ -555,7 +555,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 +664,8 @@ private static class SingletonEnumerator implements Enumerator { /** Enumerator that returns one null element. * * @param element type */ - private static class SingletonNullEnumerator<@Nullable E> implements Enumerator { + private static class SingletonNullEnumerator + implements Enumerator { int i = 0; @Override public E current() { 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..277daa1fbc37 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(); 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..78b4e83229cf 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; 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..03640662d075 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/MergeUnionEnumerator.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/MergeUnionEnumerator.java @@ -16,12 +16,11 @@ */ package org.apache.calcite.linq4j; +import org.apache.calcite.linq4j.annotations.RequiresNonNull; 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; @@ -88,8 +87,8 @@ final class MergeUnionEnumerator implements Enumerator { } @RequiresNonNull("inputs") - @SuppressWarnings("method.invocation.invalid") - private void initEnumerators(@UnknownInitialization MergeUnionEnumerator this) { + @SuppressWarnings("NullAway") + private void initEnumerators() { for (int i = 0; i < inputs.length; i++) { moveEnumerator(i); } @@ -114,7 +113,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 +121,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..fbc95d5a61f0 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;
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..ea54b9ba7189 100644
--- a/linq4j/src/main/java/org/apache/calcite/linq4j/Queryable.java
+++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Queryable.java
@@ -16,8 +16,6 @@
  */
 package org.apache.calcite.linq4j;
 
-import org.checkerframework.framework.qual.Covariant;
-
 /**
  * Provides functionality to evaluate queries against a specific data source
  * wherein the type of the data is known.
@@ -26,6 +24,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..eab9a894aeef 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;
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..b2a6750c4458 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 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..1b164543bd38 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(); @@ -268,9 +265,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); 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..18d6c701cd7b 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/RawEnumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/RawEnumerable.java @@ -16,8 +16,6 @@ */ package org.apache.calcite.linq4j; -import org.checkerframework.framework.qual.Covariant; - /** * Exposes the enumerator, which supports a simple iteration over a collection, * without the extension methods. @@ -31,7 +29,6 @@ * @param Element type * @see Enumerable */ -@Covariant(0) 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/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/EnsuresNonNull.java b/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/EnsuresNonNull.java new file mode 100644 index 000000000000..2a59fa83a2bc --- /dev/null +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/EnsuresNonNull.java @@ -0,0 +1,39 @@ +/* + * 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 the method has assigned by the time it returns. + * + *

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. + */ +@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/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/MonotonicNonNull.java b/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/MonotonicNonNull.java new file mode 100644 index 000000000000..63452b3fe7ac --- /dev/null +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/MonotonicNonNull.java @@ -0,0 +1,36 @@ +/* + * 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 that a field starts as null and is never assigned null again once it holds a value. + * + *

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. + */ +@Documented +@Retention(RetentionPolicy.CLASS) +@Target({ElementType.FIELD, ElementType.TYPE_USE}) +public @interface MonotonicNonNull { +} diff --git a/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/RequiresNonNull.java b/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/RequiresNonNull.java new file mode 100644 index 000000000000..22e33f2e0ca7 --- /dev/null +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/annotations/RequiresNonNull.java @@ -0,0 +1,40 @@ +/* + * 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 a caller must have checked before calling the method. + * + *

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. + */ +@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/Function1.java b/linq4j/src/main/java/org/apache/calcite/linq4j/function/Function1.java index e76d430be3e4..5fff55e81779 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 @@ -22,7 +22,8 @@ * @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..05345343445e 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 @@ -23,6 +23,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..6f8ffd84cc6e 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; @@ -859,7 +857,7 @@ private static class NullsLastReverseComparator * @param result type * @param first argument type * @param second argument type */ - private static final class Ignore<@Nullable R, T0, T1> + private static final class Ignore implements Function0, Function1, Function2 { @Override public R apply() { return null; @@ -873,12 +871,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..0876ed0bc073 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; 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..525922e8a2b2 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,7 @@ */ package org.apache.calcite.linq4j.tree; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.PolyNull; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Modifier; import java.lang.reflect.Type; @@ -201,7 +200,7 @@ 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) { + public @Nullable Expression appendIfNotNull(String name, @Nullable Expression expression) { if (expression == null) { return null; } 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..24a843d96438 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) { 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..2c34c99c995b 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; 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..267c8da6d6eb 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; 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..db6b52c6149d 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; 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..6c27b11137b1 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; @@ -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..bae7ad7613c5 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; 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..787c8dad0d9e 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; 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/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..46598c980727 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)); 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..97633f2b73c4 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; 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..f2f3137ea9ae 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; 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..29e6105c79b1 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; 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..9dca4808f7fc 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; 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..1bce13c7682c 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; 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..04ddd91709ad 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; 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..62e6cf394d50 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; 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/MemberExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/MemberExpression.java index 54d0d7361815..139eb45ca826 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; 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..a3e76e2934c0 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; 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..3f97b34aafa2 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; 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..86edb90f9972 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; 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..b51fd123a202 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; 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..ffe330979cab 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; 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..41c8725f0dab 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; @@ -1010,7 +1010,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/TernaryExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/TernaryExpression.java index a05504c73231..f54cad02f0cb 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; 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..8d535043e7da 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; 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..8a19ee1738d9 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; 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..16b4bf689737 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; 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..af9623490ff9 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; 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/VisitorImpl.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/VisitorImpl.java index 18025e3c791f..61c3cbd67d8b 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,7 +27,7 @@ * @param Return type */ @SuppressWarnings("unused") -public class VisitorImpl<@Nullable R> implements Visitor { +public class VisitorImpl implements Visitor { public VisitorImpl() { super(); } 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..ddd73bff37f6 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; 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..9daeec2f9483 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; 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..b8de7e0597b4 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; 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..ad1330c02246 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; 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..79f060b006a1 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,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; 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/MongoSort.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoSort.java index fd79235c4aba..45d7d7e2cc03 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,7 +30,7 @@ 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; 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..daa0faf8fd03 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,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.util.AbstractList; import java.util.List; 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..78544bbe49f4 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,7 +21,7 @@ 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; 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..d57fe4acf2a7 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; 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..e92c3feb51b5 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 @@ -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; /** * Table function that executes the OS "cpu_info". 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..a303143ce367 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 @@ -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; /** * Table function that executes the OS "cpu_info". 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..6e8162f730ee 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; 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..30cb54c66f84 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 @@ -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; /** * Table function that executes the OS "interface_addresses". 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..9b2964bc6471 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 @@ -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; /** * Table function that executes the OS "interface_details". 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..75f52a77aa65 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 @@ -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; /** * Table function that executes the OS "java_info". 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..d1c4d66b5348 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 @@ -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; /** * Table function that executes the OS "memory_info". 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..3f488f623441 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 @@ -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; /** * Table function that executes the OS "mounts". 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..0c78bbb341d6 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 @@ -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; /** * Table function that executes the OS "os_version". 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..2337bbf27c2e 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; 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..53e7424ecf1b 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; 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..f01aedb127d0 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 @@ -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; /** * Table function that executes the OS "system_info". 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..87eb474df478 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,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/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..153e8da71124 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; 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/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/RedisSchema.java b/redis/src/main/java/org/apache/calcite/adapter/redis/RedisSchema.java index 42c623895bc8..41038af92f66 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; 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..c5e562f2af5b 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; 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..97e5d0938c9c 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,7 +23,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/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/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..45ce57f684bf 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 @@ -32,7 +32,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; 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..d8b3227e8379 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; 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/SparkRules.java b/spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java index eb38a6dc17f2..51bab088d1f2 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; 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..edc4b893dcf8 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,7 +36,7 @@ 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; 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/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/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..1ff97d5a36e2 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; 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 68c14a73b735..356f5fd22771 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 90aa54b22208..d86f15e1ef52 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; From 0445ac74284d3e95604866a742f6a91d4c0919ef Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Sun, 23 Aug 2026 22:11:06 +0300 Subject: [PATCH 04/60] [CALCITE-7736] Replace @PolyNull with @Contract @PolyNull said the result is null exactly when the argument is null. The previous commit weakened it to @Nullable, which makes every caller treat the result as nullable even when it passed a non-null argument. @Contract states the direction that matters at a call site: @Contract("!null, _ -> !null") public static @Nullable Integer plus(@Nullable Integer b0, int b1) NullAway is configured with `CheckContracts=true`, so it verifies each clause against the method body rather than trusting it, and none of the 108 clauses here is rejected. Not every @PolyNull converts. A clause describes arguments, so it cannot describe a receiver parameter, and it cannot describe a varargs method, whose call sites pass a different number of arguments. Nor does it reach a type argument such as `Enumerable<@Nullable T>`, where the element rather than the result is polymorphic. Those keep the plain @Nullable. Passing a clause whose length does not match the call crashes NullAway with an IndexOutOfBoundsException from `ContractHandler.onDataflowVisitMethodInvocation`, which reads arguments by the antecedent's length without checking the arity it was given. It validates that on declarations but not at call sites; worth reporting upstream. Co-Authored-By: Claude Opus 5 --- .../config/CalciteConnectionConfig.java | 7 ++ .../config/CalciteConnectionConfigImpl.java | 7 ++ .../org/apache/calcite/plan/RelOptUtil.java | 2 + .../calcite/plan/volcano/VolcanoPlanner.java | 2 + .../calcite/rel/externalize/RelJson.java | 2 + .../rel/metadata/RelMdColumnOrigins.java | 2 + .../metadata/RelMdPercentageOriginalRows.java | 2 + .../calcite/rel/metadata/RelMdUtil.java | 4 ++ .../org/apache/calcite/rex/RexBuilder.java | 2 + .../org/apache/calcite/rex/RexLiteral.java | 2 + .../org/apache/calcite/rex/RexShuttle.java | 3 + .../org/apache/calcite/runtime/Resources.java | 4 ++ .../apache/calcite/runtime/SqlFunctions.java | 68 +++++++++++++++++++ .../java/org/apache/calcite/sql/SqlUtil.java | 2 + .../sql/validate/SqlValidatorImpl.java | 2 + .../org/apache/calcite/util/NumberUtil.java | 9 +++ .../calcite/util/SerializableCharset.java | 3 + .../java/org/apache/calcite/util/Util.java | 2 + .../calcite/linq4j/DefaultEnumerable.java | 2 + .../calcite/linq4j/ExtendedEnumerable.java | 2 + .../calcite/linq4j/tree/BlockBuilder.java | 3 + 21 files changed, 132 insertions(+) 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 84d52b62b7e2..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,6 +19,7 @@ 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; @@ -60,6 +61,7 @@ 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. */ + @Contract("_, !null -> !null") @Nullable T fun(Class operatorTableClass, @Nullable T defaultOperatorTable); /** Returns the value of {@link CalciteConnectionProperty#MODEL}. */ @@ -77,11 +79,13 @@ public interface CalciteConnectionConfig extends ConnectionConfig { /** Returns the value of {@link CalciteConnectionProperty#PARSER_FACTORY}, * or a default parser if not set. If {@code defaultParserFactory} * is not null, the result is never null. */ + @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. */ + @Contract("_, !null -> !null") @Nullable T schemaFactory(Class schemaFactoryClass, @Nullable T defaultSchemaFactory); /** Returns the value of {@link CalciteConnectionProperty#SCHEMA_TYPE}. */ @@ -94,6 +98,7 @@ 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. */ + @Contract("_, !null -> !null") @Nullable T typeSystem(Class typeSystemClass, @Nullable T defaultTypeSystem); /** Returns the value of {@link CalciteConnectionProperty#CONFORMANCE}. */ @@ -116,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. */ + @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. */ + @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 e0b2cc632b05..9410d0e33488 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; @@ -105,6 +106,7 @@ public boolean isSet(CalciteConnectionProperty property) { .getEnum(NullCollation.class, NullCollation.HIGH); } + @Contract("_, !null -> !null") @Override public @Nullable T fun(Class operatorTableClass, @Nullable T defaultOperatorTable) { final String fun = @@ -152,12 +154,14 @@ public boolean isSet(CalciteConnectionProperty property) { .getBoolean(lex().caseSensitive); } + @Contract("_, !null -> !null") @Override public @Nullable T parserFactory(Class parserFactoryClass, @Nullable T defaultParserFactory) { return CalciteConnectionProperty.PARSER_FACTORY.wrap(properties) .getPlugin(parserFactoryClass, defaultParserFactory); } + @Contract("_, !null -> !null") @Override public @Nullable T schemaFactory(Class schemaFactoryClass, @Nullable T defaultSchemaFactory) { return CalciteConnectionProperty.SCHEMA_FACTORY.wrap(properties) @@ -178,6 +182,7 @@ public boolean isSet(CalciteConnectionProperty property) { .getBoolean(); } + @Contract("_, !null -> !null") @Override public @Nullable T typeSystem(Class typeSystemClass, @Nullable T defaultTypeSystem) { return CalciteConnectionProperty.TYPE_SYSTEM.wrap(properties) @@ -219,6 +224,7 @@ public boolean isSet(CalciteConnectionProperty property) { .getBoolean(); } + @Contract("_, !null -> !null") @Override public @Nullable T metaTableFactory( Class metaTableFactoryClass, @Nullable T defaultMetaTableFactory) { @@ -226,6 +232,7 @@ public boolean isSet(CalciteConnectionProperty property) { .getPlugin(metaTableFactoryClass, defaultMetaTableFactory); } + @Contract("_, !null -> !null") @Override public @Nullable T metaColumnFactory( Class metaColumnFactoryClass, @Nullable T defaultMetaColumnFactory) { 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 166ffc81f3fa..815aae5a31fe 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; @@ -2479,6 +2480,7 @@ 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. */ + @Contract("!null, _, _ -> !null") public static @Nullable String toString( final @Nullable RelNode rel, SqlExplainLevel detailLevel, 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 f1b27aae74dd..6f2b73379df9 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,7 @@ 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; @@ -1500,6 +1501,7 @@ private RelSubset registerSubset( * @param plan Plan * @return Normalized plan */ + @Contract("!null -> !null") public static @Nullable String normalizePlan(@Nullable String plan) { if (plan == null) { return null; 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 7f4d32871044..c1bdff426b5e 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; @@ -828,6 +829,7 @@ public RexNode toRex(RelOptCluster cluster, Object o) { } @SuppressWarnings({"rawtypes", "unchecked"}) + @Contract("_, !null -> !null") @Nullable RexNode toRex(RelInput relInput, @Nullable Object o) { final RelOptCluster cluster = relInput.getCluster(); final RexBuilder rexBuilder = cluster.getRexBuilder(); 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 676263f70806..efe93d1e039c 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; @@ -276,6 +277,7 @@ private RelMdColumnOrigins() {} return set; } + @Contract("!null -> !null") private static @Nullable Set createDerivedColumnOrigins( @Nullable Set inputSet) { if (inputSet == null) { 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 66b56cad6cac..f6f3b587bcff 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; @@ -234,6 +235,7 @@ public Double getPercentageOriginalRows(Union rel, RelMetadataQuery mq) { return rel.computeSelfCost(rel.getCluster().getPlanner(), mq); } + @Contract("!null, !null -> !null") private static @Nullable Double quotientForPercentage( @Nullable Double numerator, @Nullable Double denominator) { 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 baf9c6d5cdea..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; @@ -314,6 +315,7 @@ public static void setLeftRightBitmaps( * @return the expected number of distinct values, or null if either argument * is null */ + @Contract("!null, !null -> !null") public static @Nullable Double numDistinctVals( @Nullable Double domainSize, @Nullable Double numSelected) { @@ -1080,6 +1082,7 @@ 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. */ + @Contract("!null -> !null") public static @Nullable Double validatePercentage(@Nullable Double result) { assert isPercentage(result, true); return result; @@ -1116,6 +1119,7 @@ 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 */ + @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/rex/RexBuilder.java b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java index e002c84a7821..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; @@ -2395,6 +2396,7 @@ public RexNode makeLambdaCall(RexNode expr, List parameters) { * {@link org.apache.calcite.rex.RexLiteral#valueMatchesType}. * *

Returns null if and only if {@code o} is null. */ + @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/RexLiteral.java b/core/src/main/java/org/apache/calcite/rex/RexLiteral.java index 98a9179fefde..2c7b73bae74b 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.annotations.RequiresNonNull; import org.apache.calcite.linq4j.function.Functions; import org.apache.calcite.rel.RelNode; @@ -820,6 +821,7 @@ 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 */ + @Contract("_, _, !null -> !null") public static @Nullable RexLiteral fromJdbcString( RelDataType type, SqlTypeName typeName, 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 f1c3531c6bb8..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,6 +16,7 @@ */ package org.apache.calcite.rex; +import org.apache.calcite.linq4j.annotations.Contract; import org.apache.calcite.sql.SqlAggFunction; import com.google.common.collect.ImmutableList; @@ -276,6 +277,7 @@ protected List visitFieldCollations( * *

Returns null if and only if {@code exprList} is null. */ + @Contract("!null -> !null") public final @Nullable List apply(@Nullable List exprList) { if (exprList == null) { return exprList; @@ -292,6 +294,7 @@ protected List visitFieldCollations( * Applies this shuttle to an expression, or returns null if the expression * is null. */ + @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/runtime/Resources.java b/core/src/main/java/org/apache/calcite/runtime/Resources.java index 637debfe8ab6..3ff86dcd42f0 100644 --- a/core/src/main/java/org/apache/calcite/runtime/Resources.java +++ b/core/src/main/java/org/apache/calcite/runtime/Resources.java @@ -16,6 +16,7 @@ */ package org.apache.calcite.runtime; +import org.apache.calcite.linq4j.annotations.Contract; import org.jspecify.annotations.Nullable; import org.apache.calcite.linq4j.annotations.RequiresNonNull; @@ -771,6 +772,7 @@ public StringProp(PropertyAccessor accessor, Method method) { * value if the property is not set. * *

If {@code defaultValue} is not null, never returns null. */ + @Contract("!null -> !null") public @Nullable String get(@Nullable String defaultValue) { return accessor.stringValue(this, defaultValue); } @@ -796,6 +798,7 @@ public interface PropertyAccessor { int intValue(IntProp p); int intValue(IntProp p, int defaultValue); @Nullable String stringValue(StringProp p); + @Contract("_, !null -> !null") @Nullable String stringValue(StringProp p, @Nullable String defaultValue); boolean booleanValue(BooleanProp p); boolean booleanValue(BooleanProp p, boolean defaultValue); @@ -825,6 +828,7 @@ public int intValue(IntProp p, int defaultValue) { return p.defaultValue(); } + @Contract("_, !null -> !null") @Override public @Nullable String stringValue(StringProp p, @Nullable String defaultValue) { return defaultValue; 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 db7f0189e9b6..59b93888772b 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; @@ -2793,22 +2794,26 @@ public static int plus(int b0, int b1) { /** SQL + operator applied to int values; left side may be * null. */ + @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. */ + @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. */ + @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. */ + @Contract("!null, !null -> !null") public static @Nullable Long plus(@Nullable Long b0, @Nullable Integer b1) { return (b0 == null || b1 == null) ? castNonNull(null) @@ -2816,6 +2821,7 @@ public static int plus(int b0, int b1) { } /** SQL + operator applied to nullable int and long values. */ + @Contract("!null, !null -> !null") public static @Nullable Long plus(@Nullable Integer b0, @Nullable Long b1) { return (b0 == null || b1 == null) ? castNonNull(null) @@ -2823,6 +2829,7 @@ public static int plus(int b0, int b1) { } /** SQL + operator applied to BigDecimal values. */ + @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); @@ -2830,6 +2837,7 @@ public static int plus(int b0, int b1) { /** SQL + operator applied to Object values (at least one operand * has ANY type; either may be null). */ + @Contract("!null, !null -> !null") public static @Nullable Object plusAny(@Nullable Object b0, @Nullable Object b1) { if (b0 == null || b1 == null) { @@ -2843,24 +2851,28 @@ public static int plus(int b0, int b1) { throw notArithmetic("+", b0, 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); } + @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); } + @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); } + @Contract("!null, !null -> !null") public static @Nullable ULong plus(@Nullable ULong b0, @Nullable ULong b1) { return (b0 == null || b1 == null) ? castNonNull(null) @@ -2926,22 +2938,26 @@ public static int minus(int b0, int b1) { /** SQL - operator applied to int values; left side may be * null. */ + @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. */ + @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. */ + @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. */ + @Contract("!null, !null -> !null") public static @Nullable Long minus(@Nullable Long b0, @Nullable Integer b1) { return (b0 == null || b1 == null) ? castNonNull(null) @@ -2949,6 +2965,7 @@ public static int minus(int b0, int b1) { } /** SQL - operator applied to nullable int and long values. */ + @Contract("!null, !null -> !null") public static @Nullable Long minus(@Nullable Integer b0, @Nullable Long b1) { return (b0 == null || b1 == null) ? castNonNull(null) @@ -2956,6 +2973,7 @@ public static int minus(int b0, int b1) { } /** SQL - operator applied to nullable long and long values. */ + @Contract("!null, !null -> !null") public static @Nullable Long minus(@Nullable Long b0, @Nullable Long b1) { return (b0 == null || b1 == null) ? castNonNull(null) @@ -2963,6 +2981,7 @@ public static int minus(int b0, int b1) { } /** SQL - operator applied to nullable BigDecimal values. */ + @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); @@ -2970,6 +2989,7 @@ public static int minus(int b0, int b1) { /** SQL - operator applied to Object values (at least one operand * has ANY type; either may be null). */ + @Contract("!null, !null -> !null") public static @Nullable Object minusAny(@Nullable Object b0, @Nullable Object b1) { if (b0 == null || b1 == null) { return castNonNull(null); @@ -2982,19 +3002,23 @@ public static int minus(int b0, int b1) { throw notArithmetic("-", b0, 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); } + @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); } + @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. */ + @Contract("!null, !null -> !null") public static @Nullable ULong minus(@Nullable ULong b0, @Nullable ULong b1) { return (b0 == null || b1 == null) ? castNonNull(null) @@ -3076,23 +3100,27 @@ public static int divide(int b0, int b1) { /** SQL / operator applied to int values; left side may be * null. */ + @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. */ + @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. */ + @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. */ + @Contract("_, !null -> !null") public static @Nullable Long divide(Long b0, @Nullable Integer b1) { return (b0 == null || b1 == null) ? castNonNull(null) @@ -3100,6 +3128,7 @@ public static int divide(int b0, int b1) { } /** SQL / operator applied to nullable int and long values. */ + @Contract("!null, !null -> !null") public static @Nullable Long divide(@Nullable Integer b0, @Nullable Long b1) { return (b0 == null || b1 == null) ? castNonNull(null) @@ -3107,6 +3136,7 @@ public static int divide(int b0, int b1) { } /** SQL / operator applied to BigDecimal values. */ + @Contract("!null, !null -> !null") public static @Nullable BigDecimal divide(@Nullable BigDecimal b0, @Nullable BigDecimal b1) { return (b0 == null || b1 == null) @@ -3116,6 +3146,7 @@ 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). */ + @Contract("!null, !null -> !null") public static @Nullable Object divideAny(@Nullable Object b0, @Nullable Object b1) { if (b0 == null || b1 == null) { @@ -3139,24 +3170,28 @@ public static long divide(long b0, BigDecimal b1) { .divide(b1, RoundingMode.HALF_DOWN).longValue(); } + @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()); } + @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()); } + @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()); } + @Contract("!null, !null -> !null") public static @Nullable ULong divide(@Nullable ULong b0, @Nullable ULong b1) { return (b0 == null || b1 == null) ? castNonNull(null) @@ -3230,40 +3265,47 @@ public static int multiply(int b0, int b1) { /** SQL * operator applied to int values; left side may be * null. */ + @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. */ + @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. */ + @Contract("!null, !null -> !null") public static @Nullable Integer multiply(@Nullable Integer b0, @Nullable Integer b1) { return (b0 == null || b1 == null) ? castNonNull(null) : (b0 * 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()); } + @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()); } + @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()); } + @Contract("!null, !null -> !null") public static @Nullable ULong multiply(@Nullable ULong b0, @Nullable ULong b1) { if (b0 == null || b1 == null) { @@ -3274,6 +3316,7 @@ public static int multiply(int b0, int b1) { } /** SQL * operator applied to nullable long and int values. */ + @Contract("!null, !null -> !null") public static @Nullable Long multiply(@Nullable Long b0, @Nullable Integer b1) { return (b0 == null || b1 == null) ? castNonNull(null) @@ -3281,6 +3324,7 @@ public static int multiply(int b0, int b1) { } /** SQL * operator applied to nullable int and long values. */ + @Contract("!null, !null -> !null") public static @Nullable Long multiply(@Nullable Integer b0, @Nullable Long b1) { return (b0 == null || b1 == null) ? castNonNull(null) @@ -3288,6 +3332,7 @@ public static int multiply(int b0, int b1) { } /** SQL * operator applied to nullable BigDecimal values. */ + @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); @@ -3295,6 +3340,7 @@ public static int multiply(int b0, int b1) { /** SQL * operator applied to Object values (at least one operand * has ANY type; either may be null). */ + @Contract("!null, !null -> !null") public static @Nullable Object multiplyAny(@Nullable Object b0, @Nullable Object b1) { if (b0 == null || b1 == null) { @@ -5381,6 +5427,7 @@ public static int toInt(java.sql.Date v, TimeZone timeZone) { * @see #toInt(java.sql.Date, TimeZone) * @see #internalToDate(Integer) converse method */ + @Contract("!null -> !null") public static @Nullable Integer toIntOptional(java.sql.@Nullable Date v) { return v == null ? castNonNull(null) @@ -5394,6 +5441,7 @@ public static int toInt(java.sql.Date v, TimeZone timeZone) { * * @see #toInt(java.sql.Date, TimeZone) */ + @Contract("!null, _ -> !null") public static @Nullable Integer toIntOptional(java.sql.@Nullable Date v, TimeZone timeZone) { return v == null @@ -5422,6 +5470,7 @@ public static int toInt(java.sql.Time v) { * @see #toInt(java.sql.Time) * @see #internalToTime(Integer) converse method */ + @Contract("!null -> !null") public static @Nullable Integer toIntOptional(java.sql.@Nullable Time v) { return v == null ? castNonNull(null) : toInt(v); } @@ -5443,6 +5492,7 @@ public static int toInt(Object o) { : (Integer) cannotConvert(o, int.class); } + @Contract("!null -> !null") public static @Nullable Integer toIntOptional(@Nullable Object o) { return o == null ? castNonNull(null) : toInt(o); } @@ -5508,6 +5558,7 @@ public static long toLong(Timestamp v, TimeZone timeZone) { * @see #toLong(Timestamp, TimeZone) * @see #internalToTimestamp(Long) converse method */ + @Contract("!null -> !null") public static @Nullable Long toLongOptional(@Nullable Timestamp v) { return v == null ? castNonNull(null) : toLong(v, LOCAL_TZ); } @@ -5519,6 +5570,7 @@ public static long toLong(Timestamp v, TimeZone timeZone) { * * @see #toLong(Timestamp, TimeZone) */ + @Contract("!null, _ -> !null") public static @Nullable Long toLongOptional(@Nullable Timestamp v, TimeZone timeZone) { if (v == null) { @@ -5549,6 +5601,7 @@ public static long toLong(Object o) { : (Long) cannotConvert(o, long.class); } + @Contract("!null -> !null") public static @Nullable Long toLongOptional(@Nullable Object o) { return o == null ? castNonNull(null) : toLong(o); } @@ -5646,6 +5699,7 @@ public static java.sql.Date internalToDate(int v) { * @see #internalToDate(int) * @see #toIntOptional(java.sql.Date) converse method */ + @Contract("!null -> !null") public static java.sql.@Nullable Date internalToDate(@Nullable Integer v) { return v == null ? castNonNull(null) : internalToDate(v.intValue()); } @@ -5670,10 +5724,12 @@ public static java.sql.Time internalToTime(int v) { * @see #internalToTime(Integer) * @see #toIntOptional(java.sql.Time) converse method */ + @Contract("!null -> !null") public static java.sql.@Nullable Time internalToTime(@Nullable Integer v) { return v == null ? castNonNull(null) : internalToTime(v.intValue()); } + @Contract("!null -> !null") public static @Nullable Integer toTimeWithLocalTimeZone(@Nullable String v) { if (v == null) { return castNonNull(null); @@ -5684,6 +5740,7 @@ public static java.sql.Time internalToTime(int v) { .getMillisOfDay(); } + @Contract("!null, _ -> !null") public static @Nullable Integer toTimeWithLocalTimeZone(@Nullable String v, TimeZone timeZone) { if (v == null) { @@ -6049,6 +6106,7 @@ public static java.sql.Timestamp internalToTimestamp(long v) { * @see #toLongOptional(Timestamp, TimeZone) * @see #toLongOptional(Timestamp) converse method */ + @Contract("!null -> !null") public static java.sql.@Nullable Timestamp internalToTimestamp(@Nullable Long v) { return v == null ? castNonNull(null) : internalToTimestamp(v.longValue()); } @@ -6332,6 +6390,7 @@ public static int time(long timestampMillis, String timeZone) { / (1000L * 1000L)); // milli > micro > nano } + @Contract("!null -> !null") public static @Nullable Long toTimestampWithLocalTimeZone(@Nullable String v) { if (v == null) { return castNonNull(null); @@ -6342,6 +6401,7 @@ public static int time(long timestampMillis, String timeZone) { .getMillisSinceEpoch(); } + @Contract("!null, _ -> !null") public static @Nullable Long toTimestampWithLocalTimeZone(@Nullable String v, TimeZone timeZone) { if (v == null) { @@ -6356,6 +6416,7 @@ public static int time(long timestampMillis, String timeZone) { // Don't need shortValueOf etc. - Short.valueOf is sufficient. /** Helper for CAST(... AS VARCHAR(maxLength)). */ + @Contract("!null, _ -> !null") public static @Nullable String truncate(@Nullable String s, int maxLength) { if (s == null) { return s; @@ -6367,6 +6428,7 @@ public static int time(long timestampMillis, String timeZone) { } /** Helper for CAST(... AS CHAR(maxLength)). */ + @Contract("!null, _ -> !null") public static @Nullable String truncateOrPad(@Nullable String s, int maxLength) { if (s == null) { return s; @@ -6380,6 +6442,7 @@ public static int time(long timestampMillis, String timeZone) { } } + @Contract("!null, _ -> !null") public static @Nullable ByteString stringToBinary(@Nullable String s, Charset charset) { if (s == null) { return null; @@ -6388,6 +6451,7 @@ public static int time(long timestampMillis, String timeZone) { } } + @Contract("!null -> !null") public static @Nullable ByteString byteArrayToByteString(byte @Nullable [] bytes) { if (bytes == null) { return null; @@ -6405,6 +6469,7 @@ public static int time(long timestampMillis, String timeZone) { } /** Helper for CAST(... AS VARBINARY(maxLength)). */ + @Contract("!null, _ -> !null") public static @Nullable ByteString truncate(@Nullable ByteString s, int maxLength) { if (s == null) { return s; @@ -6416,6 +6481,7 @@ public static int time(long timestampMillis, String timeZone) { } /** Helper for CAST(... AS BINARY(maxLength)). */ + @Contract("!null, _ -> !null") public static @Nullable ByteString truncateOrPad(@Nullable ByteString s, int maxLength) { if (s == null) { return s; @@ -7030,11 +7096,13 @@ public static boolean isNotFalse(@Nullable Boolean b) { } /** NULL → NULL, FALSE → TRUE, TRUE → FALSE. */ + @Contract("!null -> !null") public static @Nullable Boolean not(@Nullable Boolean b) { return b == null ? castNonNull(null) : !b; } /** Converts a JDBC array to a list. */ + @Contract("!null -> !null") public static @Nullable List arrayToList(final java.sql.@Nullable Array a) { if (a == null) { return castNonNull(null); 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 48049342ace6..74daa93de52a 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; @@ -1130,6 +1131,7 @@ 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. */ + @Contract("!null -> !null") public static @Nullable SqlNode stripAs(@Nullable SqlNode node) { if (node != null && node.getKind() == SqlKind.AS) { return ((SqlCall) node).operand(0); 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 a9e3345ac9ef..80b2974a1a6a 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,7 @@ 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; @@ -1813,6 +1814,7 @@ && 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 */ + @Contract("!null, _ -> !null") protected @Nullable SqlNode performUnconditionalRewrites( @Nullable SqlNode node, boolean underFrom) { 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 5885bfd5c24e..4ced1cbf04bd 100644 --- a/core/src/main/java/org/apache/calcite/util/NumberUtil.java +++ b/core/src/main/java/org/apache/calcite/util/NumberUtil.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.util; +import org.apache.calcite.linq4j.annotations.Contract; + import org.jspecify.annotations.Nullable; import java.math.BigDecimal; @@ -92,6 +94,7 @@ public static BigInteger getMinUnscaled(int precision) { /** Sets the scale of a BigDecimal {@code bd} if it is not null; * always returns {@code bd}. */ + @Contract("!null, _ -> !null") public static @Nullable BigDecimal rescaleBigDecimal(@Nullable BigDecimal bd, int scale) { if (bd != null) { @@ -107,6 +110,7 @@ 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. */ + @Contract("!null -> !null") public static @Nullable BigDecimal toBigDecimal(@Nullable Number number) { if (number == null) { return castNonNull(null); @@ -145,6 +149,7 @@ public static long round(double d) { } /** Returns the sum of two numbers, or null if either is null. */ + @Contract("!null, !null -> !null") public static @Nullable Double add(@Nullable Double a, @Nullable Double b) { if (a == null || b == null) { return null; @@ -155,6 +160,7 @@ public static long round(double d) { /** Returns the difference of two numbers, * or null if either is null. */ + @Contract("!null, !null -> !null") public static @Nullable Double subtract(@Nullable Double a, @Nullable Double b) { if (a == null || b == null) { return castNonNull(null); @@ -175,6 +181,7 @@ public static long round(double d) { /** Returns the product of two numbers, * or null if either is null. */ + @Contract("!null, !null -> !null") public static @Nullable Double multiply(@Nullable Double a, @Nullable Double b) { if (a == null || b == null) { return castNonNull(null); @@ -187,6 +194,7 @@ public static long round(double d) { * returns the lesser of two numbers, * ignoring numbers that are null, * or null if both are null. */ + @Contract("!null, !null -> !null") public static @Nullable Double min(@Nullable Double a, @Nullable Double b) { if (a == null) { return b; @@ -200,6 +208,7 @@ 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. */ + @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/SerializableCharset.java b/core/src/main/java/org/apache/calcite/util/SerializableCharset.java index 000c20b8922f..262c43d7822a 100644 --- a/core/src/main/java/org/apache/calcite/util/SerializableCharset.java +++ b/core/src/main/java/org/apache/calcite/util/SerializableCharset.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.util; +import org.apache.calcite.linq4j.annotations.Contract; + import org.jspecify.annotations.Nullable; import java.io.IOException; @@ -91,6 +93,7 @@ public Charset getCharset() { * @param charset Character set to wrap, or null * @return Wrapped 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/Util.java b/core/src/main/java/org/apache/calcite/util/Util.java index 9446c8d2fd25..bd8735b0a299 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; @@ -682,6 +683,7 @@ 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. */ + @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()) { 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 eccd6ab38e96..6854641ea159 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.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; @@ -96,6 +97,7 @@ protected OrderedQueryable asOrderedQueryable() { return EnumerableDefaults.aggregate(getThis(), func); } + @Contract("!null, !null -> !null") @Override public @Nullable TAccumulate aggregate(@Nullable TAccumulate seed, Function2<@Nullable TAccumulate, T, @Nullable TAccumulate> func) { return EnumerableDefaults.aggregate(getThis(), seed, func); 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 c4dde33c2fc0..8136f645ec7a 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; @@ -73,6 +74,7 @@ public interface ExtendedEnumerable { * *

If {@code seed} is not null, the result is never null. */ + @Contract("!null, !null -> !null") @Nullable TAccumulate aggregate(@Nullable TAccumulate seed, Function2<@Nullable TAccumulate, TSource, @Nullable TAccumulate> func); 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 525922e8a2b2..11370c31892e 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,6 +16,8 @@ */ package org.apache.calcite.linq4j.tree; +import org.apache.calcite.linq4j.annotations.Contract; + import org.jspecify.annotations.Nullable; import java.lang.reflect.Modifier; @@ -200,6 +202,7 @@ public Expression append(String name, Expression expression) { * Appends an expression to a list of statements if it is not null, * and returns the expression. */ + @Contract("_, !null -> !null") public @Nullable Expression appendIfNotNull(String name, @Nullable Expression expression) { if (expression == null) { return null; From b30ab887cebcee5ff22b406a834dbaea1ed575dd Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Sun, 23 Aug 2026 22:11:07 +0300 Subject: [PATCH 05/60] [CALCITE-7736] Give type parameters the nullable bounds the Checker Framework inferred The two tools default an unwritten type parameter bound in opposite directions. The Checker Framework's CLIMB-to-top rule gives implicit bounds the top qualifier, so `` there means ``. JSpecify fills in `Object`, which under `@NullMarked` is non-null, and its user guide says as much: "`` means `` and that means it is not `@Nullable`". So every unbounded type parameter silently changed meaning. Calcite relied on the Checker Framework reading, for instance here: public interface SqlVisitor { ... } public class SqlShuttle extends SqlBasicVisitor<@Nullable SqlNode> { ... } public abstract R accept(SqlVisitor visitor); `SqlShuttle` is a `SqlVisitor<@Nullable SqlNode>` and was passed to `accept` with no suppression, which only typechecks if R admits a nullable argument. Writes the bound out at 61 declarations: the Rex and Sql visitors and the 23 `accept` overrides, `Pair` and its factories, `PairList`, `ConsList`, `FlatLists`, `Holder`, `ImmutableNullableList`, `TryThreadLocal`, `Util.transform`, and the linq4j types `Enumerable`, `Enumerator`, `Queryable`, `Function0`, `Function1`, `Function2` and `Ord`. The erasure is unchanged, so this is binary compatible. This accounts for most of what NullAway reported: 1126 errors down to 576 in `calcite-core`. `Pair.of` alone was worth 132 -- its class already had the bounds, but a static factory declares type parameters of its own. Co-Authored-By: Claude Opus 5 --- .../org/apache/calcite/adapter/clone/ArrayTable.java | 2 +- .../apache/calcite/config/CalciteSystemProperty.java | 2 +- .../apache/calcite/plan/RexImplicationChecker.java | 2 +- .../java/org/apache/calcite/rex/RexBiVisitor.java | 4 +++- .../main/java/org/apache/calcite/rex/RexCall.java | 2 +- .../org/apache/calcite/rex/RexCorrelVariable.java | 2 +- .../java/org/apache/calcite/rex/RexDynamicParam.java | 2 +- .../java/org/apache/calcite/rex/RexFieldAccess.java | 2 +- .../java/org/apache/calcite/rex/RexInputRef.java | 2 +- .../main/java/org/apache/calcite/rex/RexLambda.java | 2 +- .../java/org/apache/calcite/rex/RexLambdaRef.java | 2 +- .../main/java/org/apache/calcite/rex/RexLiteral.java | 2 +- .../java/org/apache/calcite/rex/RexLocalRef.java | 2 +- .../main/java/org/apache/calcite/rex/RexNode.java | 2 +- .../org/apache/calcite/rex/RexNodeAndFieldIndex.java | 2 +- .../main/java/org/apache/calcite/rex/RexOver.java | 2 +- .../org/apache/calcite/rex/RexPatternFieldRef.java | 4 +++- .../java/org/apache/calcite/rex/RexRangeRef.java | 2 +- .../java/org/apache/calcite/rex/RexSimplify.java | 2 +- .../java/org/apache/calcite/rex/RexSubQuery.java | 2 +- .../org/apache/calcite/rex/RexTableInputRef.java | 2 +- .../main/java/org/apache/calcite/rex/RexVisitor.java | 4 +++- .../java/org/apache/calcite/runtime/ConsList.java | 2 +- .../java/org/apache/calcite/runtime/FlatLists.java | 12 ++++++------ .../java/org/apache/calcite/runtime/PairList.java | 2 +- .../apache/calcite/runtime/ResultSetEnumerable.java | 2 +- .../main/java/org/apache/calcite/sql/SqlCall.java | 2 +- .../java/org/apache/calcite/sql/SqlDataTypeSpec.java | 2 +- .../java/org/apache/calcite/sql/SqlDynamicParam.java | 2 +- .../java/org/apache/calcite/sql/SqlIdentifier.java | 2 +- .../org/apache/calcite/sql/SqlIntervalQualifier.java | 2 +- .../main/java/org/apache/calcite/sql/SqlLiteral.java | 2 +- .../main/java/org/apache/calcite/sql/SqlNode.java | 2 +- .../java/org/apache/calcite/sql/SqlNodeList.java | 2 +- .../java/org/apache/calcite/sql/util/SqlVisitor.java | 4 +++- .../main/java/org/apache/calcite/util/Holder.java | 2 +- .../apache/calcite/util/ImmutableNullableList.java | 2 +- core/src/main/java/org/apache/calcite/util/Pair.java | 12 ++++++------ .../java/org/apache/calcite/util/TryThreadLocal.java | 2 +- core/src/main/java/org/apache/calcite/util/Util.java | 10 +++++----- .../java/org/apache/calcite/linq4j/Enumerable.java | 4 +++- .../apache/calcite/linq4j/EnumerableDefaults.java | 2 +- .../java/org/apache/calcite/linq4j/Enumerator.java | 4 +++- .../src/main/java/org/apache/calcite/linq4j/Ord.java | 2 +- .../java/org/apache/calcite/linq4j/Queryable.java | 4 +++- .../apache/calcite/linq4j/function/Function0.java | 4 +++- .../apache/calcite/linq4j/function/Function1.java | 4 +++- .../apache/calcite/linq4j/function/Function2.java | 6 ++++-- 48 files changed, 83 insertions(+), 63 deletions(-) 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 a6e5820787ab..5b36539fd028 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 @@ -798,7 +798,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/config/CalciteSystemProperty.java b/core/src/main/java/org/apache/calcite/config/CalciteSystemProperty.java index 69882c616487..dbb82279004b 100644 --- a/core/src/main/java/org/apache/calcite/config/CalciteSystemProperty.java +++ b/core/src/main/java/org/apache/calcite/config/CalciteSystemProperty.java @@ -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. * 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 22ed8943ff85..36dd368ec01e 100644 --- a/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java +++ b/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java @@ -523,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/rex/RexBiVisitor.java b/core/src/main/java/org/apache/calcite/rex/RexBiVisitor.java index 995b2e97271f..37dd7745c73b 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/RexCall.java b/core/src/main/java/org/apache/calcite/rex/RexCall.java index 3af137e0a6cd..bba28f275361 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexCall.java +++ b/core/src/main/java/org/apache/calcite/rex/RexCall.java @@ -192,7 +192,7 @@ 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); } 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 ee576085f73b..95b5ff1294c8 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexCorrelVariable.java +++ b/core/src/main/java/org/apache/calcite/rex/RexCorrelVariable.java @@ -47,7 +47,7 @@ public class RexCorrelVariable extends RexVariable { //~ Methods ---------------------------------------------------------------- - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitCorrelVariable(this); } 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 10269b5729f2..aa011a46494b 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexDynamicParam.java +++ b/core/src/main/java/org/apache/calcite/rex/RexDynamicParam.java @@ -56,7 +56,7 @@ public int getIndex() { return index; } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitDynamicParam(this); } 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 da42d57aca43..7db5629ec2a0 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexFieldAccess.java +++ b/core/src/main/java/org/apache/calcite/rex/RexFieldAccess.java @@ -99,7 +99,7 @@ public RelDataTypeField getField() { return SqlKind.FIELD_ACCESS; } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitFieldAccess(this); } 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 98f50214fe35..79492da8ce91 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexInputRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexInputRef.java @@ -121,7 +121,7 @@ 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); } 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 fae0c4184b93..31a5d7c9d850 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLambda.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLambda.java @@ -55,7 +55,7 @@ public class RexLambda extends RexNode { return SqlKind.LAMBDA; } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitLambda(this); } 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 092154f91b7f..edde8abc1405 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLambdaRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLambdaRef.java @@ -36,7 +36,7 @@ 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); } 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 2c7b73bae74b..fb2987de49f5 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLiteral.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLiteral.java @@ -1337,7 +1337,7 @@ 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); } 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 d6a337389435..bb5e1b6d3367 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLocalRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLocalRef.java @@ -74,7 +74,7 @@ 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); } 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 5d8e9b86fb85..3112e03fee54 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexNode.java +++ b/core/src/main/java/org/apache/calcite/rex/RexNode.java @@ -107,7 +107,7 @@ 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 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 f84f0d8dbe8b..be03733d45e1 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexNodeAndFieldIndex.java +++ b/core/src/main/java/org/apache/calcite/rex/RexNodeAndFieldIndex.java @@ -74,7 +74,7 @@ public int getFieldIndex() { return fieldIndex; } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitNodeAndFieldIndex(this); } 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 4770ae40b460..89721bc84582 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexOver.java +++ b/core/src/main/java/org/apache/calcite/rex/RexOver.java @@ -152,7 +152,7 @@ public boolean ignoreNulls() { return sb.toString(); } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitOver(this); } 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..7543b63a8bfe 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,7 +45,7 @@ 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); } 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 8d2a06bc3bd5..845cb071d9ec 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexRangeRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexRangeRef.java @@ -71,7 +71,7 @@ public int getOffset() { return offset; } - @Override public R accept(RexVisitor visitor) { + @Override public R accept(RexVisitor visitor) { return visitor.visitRangeRef(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 d375e404dc86..e7919a0ec595 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java +++ b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java @@ -3727,7 +3727,7 @@ > 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(); } 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 9bf31c32bffe..02a16ad0f02d 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexSubQuery.java +++ b/core/src/main/java/org/apache/calcite/rex/RexSubQuery.java @@ -160,7 +160,7 @@ 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); } 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 51adef917eca..432c5c7fc612 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexTableInputRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexTableInputRef.java @@ -85,7 +85,7 @@ 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); } 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/runtime/ConsList.java b/core/src/main/java/org/apache/calcite/runtime/ConsList.java index 5d4914c49d83..856a1b20e956 100644 --- a/core/src/main/java/org/apache/calcite/runtime/ConsList.java +++ b/core/src/main/java/org/apache/calcite/runtime/ConsList.java @@ -33,7 +33,7 @@ * * @param Element type */ -public class ConsList extends AbstractImmutableList { +public class ConsList extends AbstractImmutableList { private final E first; private final List rest; 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 a552342071cd..9b3a0fbddf8e 100644 --- a/core/src/main/java/org/apache/calcite/runtime/FlatLists.java +++ b/core/src/main/java/org/apache/calcite/runtime/FlatLists.java @@ -321,7 +321,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; @@ -433,7 +433,7 @@ protected static class Flat1List * * @param Element type */ - protected static class Flat2List + protected static class Flat2List extends AbstractFlatList implements ComparableList { private final T t0; @@ -566,7 +566,7 @@ protected static class Flat2List * * @param Element type */ - protected static class Flat3List + protected static class Flat3List extends AbstractFlatList implements ComparableList { private final T t0; @@ -716,7 +716,7 @@ protected static class Flat3List * * @param Element type */ - protected static class Flat4List + protected static class Flat4List extends AbstractFlatList implements ComparableList { private final T t0; @@ -886,7 +886,7 @@ protected static class Flat4List * * @param Element type */ - protected static class Flat5List + protected static class Flat5List extends AbstractFlatList implements ComparableList { private final T t0; @@ -1075,7 +1075,7 @@ protected static class Flat5List * * @param Element type */ - protected static class Flat6List + protected static class Flat6List extends AbstractFlatList implements ComparableList { private final T t0; 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 a1d0275e3421..5199d1cf0fb7 100644 --- a/core/src/main/java/org/apache/calcite/runtime/PairList.java +++ b/core/src/main/java/org/apache/calcite/runtime/PairList.java @@ -39,7 +39,7 @@ * @param First type * @param Second type */ -public interface PairList +public interface PairList extends List> { /** Creates an empty PairList. */ static PairList of() { 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 8a0a08033b11..6db07d360740 100644 --- a/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java +++ b/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java @@ -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; 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 7ad2ce061c49..001cef2b48e6 100755 --- a/core/src/main/java/org/apache/calcite/sql/SqlCall.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlCall.java @@ -170,7 +170,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); } 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 db1e05122d16..d425c5e36749 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlDataTypeSpec.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlDataTypeSpec.java @@ -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/SqlDynamicParam.java b/core/src/main/java/org/apache/calcite/sql/SqlDynamicParam.java index eb149f2ba339..a44b3e5b9472 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlDynamicParam.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlDynamicParam.java @@ -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/SqlIdentifier.java b/core/src/main/java/org/apache/calcite/sql/SqlIdentifier.java index a55b133a4e84..f3bb728683f9 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlIdentifier.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlIdentifier.java @@ -319,7 +319,7 @@ public SqlIdentifier skipLast(int n) { return litmus.succeed(); } - @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/SqlIntervalQualifier.java b/core/src/main/java/org/apache/calcite/sql/SqlIntervalQualifier.java index c07ca28b47f9..4f5805639ce8 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlIntervalQualifier.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlIntervalQualifier.java @@ -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); } 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 666bb8055899..8015961a4000 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlLiteral.java @@ -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/SqlNode.java b/core/src/main/java/org/apache/calcite/sql/SqlNode.java index c35806ad67cd..c34e27515e93 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlNode.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlNode.java @@ -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. 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 443393a14ec2..7283f3bdc652 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlNodeList.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlNodeList.java @@ -269,7 +269,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/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/util/Holder.java b/core/src/main/java/org/apache/calcite/util/Holder.java index 2124562bba5c..6b923e075265 100644 --- a/core/src/main/java/org/apache/calcite/util/Holder.java +++ b/core/src/main/java/org/apache/calcite/util/Holder.java @@ -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/ImmutableNullableList.java b/core/src/main/java/org/apache/calcite/util/ImmutableNullableList.java index 6fe64eeba65d..26408597114f 100644 --- a/core/src/main/java/org/apache/calcite/util/ImmutableNullableList.java +++ b/core/src/main/java/org/apache/calcite/util/ImmutableNullableList.java @@ -207,7 +207,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/Pair.java b/core/src/main/java/org/apache/calcite/util/Pair.java index c640c52d5e0c..3f1099a8c376 100644 --- a/core/src/main/java/org/apache/calcite/util/Pair.java +++ b/core/src/main/java/org/apache/calcite/util/Pair.java @@ -44,7 +44,7 @@ * @param Right-hand type */ @SuppressWarnings("NullAway") -public class Pair +public class Pair implements Comparable>, Map.Entry, Serializable { @SuppressWarnings({"rawtypes", "unchecked"}) @@ -82,7 +82,7 @@ public Pair(T1 left, T2 right) { * @param right right value * @return A Pair */ - public static Pair of( + public static Pair of( T1 left, T2 right) { return new Pair<>(left, right); } @@ -339,7 +339,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); } @@ -352,13 +352,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(); @@ -367,7 +367,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/TryThreadLocal.java b/core/src/main/java/org/apache/calcite/util/TryThreadLocal.java index 33a90e2e71d5..cc601dcdd14e 100644 --- a/core/src/main/java/org/apache/calcite/util/TryThreadLocal.java +++ b/core/src/main/java/org/apache/calcite/util/TryThreadLocal.java @@ -30,7 +30,7 @@ * * @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 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 bd8735b0a299..e8aefee5c0ad 100644 --- a/core/src/main/java/org/apache/calcite/util/Util.java +++ b/core/src/main/java/org/apache/calcite/util/Util.java @@ -1865,7 +1865,7 @@ 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( + public static Iterator cast( final Iterator iter, final Class clazz) { return transform(iter, x -> clazz.cast(castNonNull(x))); @@ -2746,7 +2746,7 @@ public static UnaryOperator andThen(UnaryOperator op1, } /** Transforms a list, applying a function to each element. */ - public static + public static List transform(List list, java.util.function.Function function) { if (list.isEmpty() && list instanceof ImmutableList) { @@ -2760,7 +2760,7 @@ 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 + public static List transformIndexed(List list, BiFunction function) { if (list.isEmpty() && list instanceof ImmutableList) { @@ -2774,7 +2774,7 @@ List transformIndexed(List list, /** Transforms an iterable, applying a function to each element. */ @API(since = "1.27", status = API.Status.EXPERIMENTAL) - public static + public static Iterable transform(Iterable iterable, java.util.function.Function function) { // FluentIterable provides toString @@ -2787,7 +2787,7 @@ Iterable transform(Iterable iterable, /** Transforms an iterator. */ @API(since = "1.27", status = API.Status.EXPERIMENTAL) - public static + public static Iterator transform(Iterator iterator, java.util.function.Function function) { return new TransformingIterator<>(iterator, function); 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 b8afb58cb21e..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,6 +16,8 @@ */ package org.apache.calcite.linq4j; +import org.jspecify.annotations.Nullable; + /** * Exposes the enumerator, which supports a simple iteration over a collection. * @@ -26,7 +28,7 @@ * * @param Element type */ -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 05c9c40e2601..c4c012ddae44 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java @@ -4802,7 +4802,7 @@ static class SkipWhileBigDecimalEnumerator implements Enumerator source element type * @param element type */ - static class CastingEnumerator + static class CastingEnumerator implements Enumerator { private final Enumerator enumerator; private final Class clazz; 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 bd9e28be31fc..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,6 +16,8 @@ */ package org.apache.calcite.linq4j; +import org.jspecify.annotations.Nullable; + /** * Supports a simple iteration over a collection. * @@ -26,7 +28,7 @@ * * @param Element type */ -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/Ord.java b/linq4j/src/main/java/org/apache/calcite/linq4j/Ord.java index fbc95d5a61f0..55baf3fc2af4 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Ord.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Ord.java @@ -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; 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 ea54b9ba7189..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,6 +16,8 @@ */ package org.apache.calcite.linq4j; +import org.jspecify.annotations.Nullable; + /** * Provides functionality to evaluate queries against a specific data source * wherein the type of the data is known. @@ -24,6 +26,6 @@ * * @param Element type */ -public interface Queryable +public interface Queryable extends RawQueryable, ExtendedQueryable { } 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 5fff55e81779..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,15 @@ */ 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 +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 05345343445e..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,7 +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); } From 6830779995545157ff75a01efce633c784a3599b Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 10:43:57 +0300 Subject: [PATCH 06/60] [CALCITE-7736] Let the linq4j tree visitor return null `Visitor` computes a value by walking a node tree, and there is nothing to compute for an empty subtree: `Expressions.acceptNodes` returns the result of the last node, or null when the list is empty, and `VisitorImpl` returns a bare `null` for a `FunctionExpression` with no body and for a `GotoStatement` with no expression. `Visitor.visit` and `Node.accept(Visitor)` now say so, and the type variable takes the nullable bound the Checker Framework used to infer for it. Under the Checker Framework this was `VisitorImpl<@Nullable R>`, which forced R to be nullable; JSpecify tracks upper bounds only, so the annotation moves to the result. `UseCounter` extended `VisitorImpl`, a type whose only value is null. It now extends `VisitorImpl<@Nullable Void>`, like `MayThrowVisitor`. Nothing outside `org.apache.calcite.linq4j.tree` implements `Visitor` or calls the `accept` overload that takes one. Co-Authored-By: Claude Opus 5 --- .../calcite/linq4j/tree/BinaryExpression.java | 2 +- .../calcite/linq4j/tree/BlockBuilder.java | 2 +- .../calcite/linq4j/tree/BlockStatement.java | 2 +- .../calcite/linq4j/tree/ClassDeclaration.java | 2 +- .../linq4j/tree/ConditionalExpression.java | 2 +- .../linq4j/tree/ConditionalStatement.java | 2 +- .../linq4j/tree/ConstantExpression.java | 2 +- .../linq4j/tree/ConstructorDeclaration.java | 2 +- .../linq4j/tree/DeclarationStatement.java | 2 +- .../linq4j/tree/DefaultExpression.java | 4 +- .../linq4j/tree/DynamicExpression.java | 4 +- .../calcite/linq4j/tree/Expressions.java | 2 +- .../calcite/linq4j/tree/FieldDeclaration.java | 2 +- .../calcite/linq4j/tree/ForEachStatement.java | 2 +- .../calcite/linq4j/tree/ForStatement.java | 2 +- .../linq4j/tree/FunctionExpression.java | 2 +- .../calcite/linq4j/tree/GotoStatement.java | 2 +- .../calcite/linq4j/tree/IndexExpression.java | 2 +- .../linq4j/tree/InvocationExpression.java | 4 +- .../calcite/linq4j/tree/LabelStatement.java | 2 +- .../calcite/linq4j/tree/LambdaExpression.java | 4 +- .../linq4j/tree/ListInitExpression.java | 4 +- .../calcite/linq4j/tree/MemberExpression.java | 2 +- .../linq4j/tree/MemberInitExpression.java | 4 +- .../linq4j/tree/MethodCallExpression.java | 2 +- .../linq4j/tree/MethodDeclaration.java | 2 +- .../linq4j/tree/NewArrayExpression.java | 2 +- .../calcite/linq4j/tree/NewExpression.java | 2 +- .../org/apache/calcite/linq4j/tree/Node.java | 4 +- .../linq4j/tree/ParameterExpression.java | 2 +- .../calcite/linq4j/tree/SwitchStatement.java | 4 +- .../linq4j/tree/TernaryExpression.java | 2 +- .../calcite/linq4j/tree/ThrowStatement.java | 2 +- .../calcite/linq4j/tree/TryStatement.java | 2 +- .../linq4j/tree/TypeBinaryExpression.java | 2 +- .../calcite/linq4j/tree/UnaryExpression.java | 2 +- .../apache/calcite/linq4j/tree/Visitor.java | 72 ++++++++++--------- .../calcite/linq4j/tree/VisitorImpl.java | 68 +++++++++--------- .../calcite/linq4j/tree/WhileStatement.java | 2 +- 39 files changed, 124 insertions(+), 106 deletions(-) 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 0876ed0bc073..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 @@ -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 11370c31892e..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 @@ -606,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 24a843d96438..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 @@ -63,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/ClassDeclaration.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ClassDeclaration.java index 2c34c99c995b..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 @@ -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/ConditionalExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ConditionalExpression.java index 267c8da6d6eb..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 @@ -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 db6b52c6149d..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 @@ -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 6c27b11137b1..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 @@ -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); } 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 bae7ad7613c5..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 @@ -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 787c8dad0d9e..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 @@ -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/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/Expressions.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Expressions.java index 46598c980727..48916d4a7a8b 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 @@ -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 97633f2b73c4..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 @@ -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 f2f3137ea9ae..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 @@ -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 29e6105c79b1..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 @@ -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 9dca4808f7fc..00a3500ffe9b 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 @@ -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); } 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 1bce13c7682c..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 @@ -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 04ddd91709ad..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 @@ -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 62e6cf394d50..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 @@ -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/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 139eb45ca826..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 @@ -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 a3e76e2934c0..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 @@ -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 3f97b34aafa2..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 @@ -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 86edb90f9972..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 @@ -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 b51fd123a202..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 @@ -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/ParameterExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/ParameterExpression.java index ffe330979cab..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 @@ -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/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 f54cad02f0cb..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 @@ -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 8d535043e7da..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 @@ -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 8a19ee1738d9..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 @@ -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 16b4bf689737..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 @@ -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/UnaryExpression.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/UnaryExpression.java index af9623490ff9..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 @@ -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/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 61c3cbd67d8b..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 @@ -32,38 +32,38 @@ 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 ddd73bff37f6..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 @@ -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); } From 352ebdfa895aa86aa05c3e58ef6177cc72f3d90e Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 10:51:31 +0300 Subject: [PATCH 07/60] [CALCITE-7736] Admit that min and max return null for an empty sequence The seedless `aggregate` starts from the first element and returns null when there is none. The `min` and `max` overloads that call it returned a non-null type anyway, so an empty sequence produced a null the signature ruled out. Eight of them now say `@Nullable`; the other overloads either seed the accumulator or already wrap the call in `requireNonNull`, and are unchanged. Four `min` and `max` overloads were already annotated, so this makes the family consistent. `aggregate` declares its accumulator `Function2<@Nullable TSource, TSource, TSource>`, and the reducers it is called with genuinely handle a null accumulator -- every `MIN` and `MAX` constant in `Extensions` opens with `v1 == null`. Their declarations now match; the `SUM` constants do not test for null and keep the non-null accumulator. Co-Authored-By: Claude Opus 5 --- .../calcite/linq4j/EnumerableDefaults.java | 28 +++++++++---------- .../org/apache/calcite/linq4j/Extensions.java | 22 ++++++++------- 2 files changed, 26 insertions(+), 24 deletions(-) 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 c4c012ddae44..a11d72b6b305 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java @@ -2942,7 +2942,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()); } @@ -2951,7 +2951,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()); } @@ -2961,7 +2961,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()); } @@ -2980,7 +2980,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); } @@ -2999,7 +2999,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); } @@ -3062,22 +3062,22 @@ 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(); return aggregate(source.select(selector), null, min); @@ -3088,7 +3088,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()); } @@ -3107,7 +3107,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); } 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 From 8d0c6808cb512306873f0211f82c8fa478766f01 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 11:00:20 +0300 Subject: [PATCH 08/60] [CALCITE-7736] Let a seeded aggregate start from null `aggregate(source, seed, func)` is the reduce that takes a starting value, and `min` and `max` start it at null. Its accumulator type variable was non-null, so the seed, the reducer and the result all disagreed with the call. `TAccumulate` and `TResult` take the nullable bound the Checker Framework used to infer for them. The reducer parameter becomes `Function2`: the constants in `Extensions` accept a null accumulator but never produce one, and the wildcard is what lets a reducer with a non-null result feed a nullable seed. Three more `min` overloads return null for an empty sequence and now say so, and `long min(Enumerable, LongFunction1)` wraps the call in `requireNonNull`, which is what the other overloads that unbox the accumulator already do. `EqualityComparer` takes the nullable bound as well; `Functions` builds comparers over nullable elements. The two `aggregate` bodies carry a NullAway suppression. Assigning the result of a call returning `? extends TAccumulate` to a `TAccumulate` local makes NullAway report the local as @Nullable, even on `return result;` where the local's type is the return type. Spelling the type argument exactly reports nothing, so the wildcard is what triggers it. Co-Authored-By: Claude Opus 5 --- .../calcite/linq4j/EnumerableDefaults.java | 26 +++++++++++++------ .../linq4j/function/EqualityComparer.java | 4 ++- 2 files changed, 21 insertions(+), 9 deletions(-) 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 a11d72b6b305..d17442ceec89 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java @@ -102,9 +102,13 @@ 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. + @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()) { @@ -121,9 +125,14 @@ 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. + @SuppressWarnings("NullAway") + public static TResult aggregate( Enumerable source, TAccumulate seed, - Function2 func, + Function2 func, Function1 selector) { TAccumulate accumulate = seed; try (Enumerator os = source.enumerator()) { @@ -3126,7 +3135,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); } @@ -3137,7 +3146,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)); } /** @@ -3145,7 +3155,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); } @@ -3165,7 +3175,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); } 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); From 27e777b6824b317d5d0a193c404654047144723b Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 11:18:51 +0300 Subject: [PATCH 09/60] [CALCITE-7736] Drop castNonNull calls whose argument is already non-null NullAway reports a `castToNonNull` whose argument it can already prove non-null, which is how it flags a cast that has stopped earning its place. Four of them in `EnumerableDefaults`: `curAccumulator` is assigned from `accumulatorInitializer.apply()` a few lines above each use, and `outerValue` from `outerValues.get(i)`. Co-Authored-By: Claude Opus 5 --- .../org/apache/calcite/linq4j/EnumerableDefaults.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 d17442ceec89..350716f265cb 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java @@ -1125,18 +1125,18 @@ private static class SortedAggregateEnumerator 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 From 193cfbd4d1ec17dfe0c3ae480b9e989824ba0abe Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 11:22:59 +0300 Subject: [PATCH 10/60] [CALCITE-7736] Handle the nulls the JDK actually hands out Four places read a value the JDK is entitled to leave null. The Checker Framework knew about the first two from `InvocationHandler.astub`, which this migration deleted; NullAway's own JDK models say the same thing. * `InvocationHandler.invoke` receives a null `args` array when the proxied method declares no parameters. `Compatible` indexed it, and `FunctionExpression` forwarded it to a varargs call that requires an array. * `Primitive.asList` adapts a primitive array, whose elements box to a non-null value, so the `Array.get` result is cast rather than checked. * `EnumerableDefaults.takeTopN` looked up the key it had just read from `lastKey()`, and suppressed the finding on the declaration while dereferencing the value on the next line. It now uses `requireNonNull`. Co-Authored-By: Claude Opus 5 --- .../org/apache/calcite/linq4j/EnumerableDefaults.java | 11 +++++------ .../calcite/linq4j/tree/FunctionExpression.java | 3 ++- .../org/apache/calcite/linq4j/tree/Primitive.java | 4 +++- .../org/apache/calcite/linq4j/util/Compatible.java | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) 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 350716f265cb..71dc1e7315df 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java @@ -3088,7 +3088,7 @@ public static float max(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); } @@ -3166,8 +3166,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)); } /** @@ -3187,7 +3187,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); } @@ -3294,8 +3294,7 @@ public static Enumerable orderBy( continue; } // remove last entry from tree map, so that we keep at most 'needed' rows - @SuppressWarnings("NullAway") - List l = map.get(lastKey); + List l = requireNonNull(map.get(lastKey), "map.get(lastKey)"); if (l.size() == 1) { map.remove(lastKey); } else { 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 00a3500ffe9b..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 @@ -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/Primitive.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Primitive.java index 41c8725f0dab..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 @@ -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() { 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 9daeec2f9483..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 @@ -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; }); From 40492e0652e136a60f3b64bda277e608cc5b34bc Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 11:27:09 +0300 Subject: [PATCH 11/60] [CALCITE-7736] Remove two annotations the migration made untrue `MergeUnionEnumerator.initEnumerators` carried `@RequiresNonNull("inputs")`. `inputs` is a final field assigned in the constructor; the annotation existed to get the Checker Framework's initialization checker past a call made from that constructor. NullAway does its own initialization analysis, so the annotation only made callers prove something already guaranteed, and the suppression that silenced it goes with it. `DefaultEnumerable.aggregate` carried `@Contract("!null, !null -> !null")`, generated when `@PolyNull` was replaced. The original was polymorphic in the accumulator function as well, so a non-null seed implied a non-null result. The function may now return null, which makes the clause claim more than the method delivers -- and NullAway, running with `CheckContracts`, said so. Co-Authored-By: Claude Opus 5 --- .../main/java/org/apache/calcite/linq4j/DefaultEnumerable.java | 2 -- .../java/org/apache/calcite/linq4j/MergeUnionEnumerator.java | 3 --- 2 files changed, 5 deletions(-) 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 6854641ea159..eccd6ab38e96 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java @@ -16,7 +16,6 @@ */ 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; @@ -97,7 +96,6 @@ protected OrderedQueryable asOrderedQueryable() { return EnumerableDefaults.aggregate(getThis(), func); } - @Contract("!null, !null -> !null") @Override public @Nullable TAccumulate aggregate(@Nullable TAccumulate seed, Function2<@Nullable TAccumulate, T, @Nullable TAccumulate> func) { return EnumerableDefaults.aggregate(getThis(), seed, func); 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 03640662d075..fc320e96237d 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/MergeUnionEnumerator.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/MergeUnionEnumerator.java @@ -16,7 +16,6 @@ */ package org.apache.calcite.linq4j; -import org.apache.calcite.linq4j.annotations.RequiresNonNull; import org.apache.calcite.linq4j.function.EqualityComparer; import org.apache.calcite.linq4j.function.Function1; @@ -86,8 +85,6 @@ final class MergeUnionEnumerator implements Enumerator { initEnumerators(); } - @RequiresNonNull("inputs") - @SuppressWarnings("NullAway") private void initEnumerators() { for (int i = 0; i < inputs.length; i++) { moveEnumerator(i); From 98c896da2908f8be355b048af3aac9fdcce16bf5 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 11:27:09 +0300 Subject: [PATCH 12/60] [CALCITE-7736] Let the memory window hold the nulls it is padded with `MemoryFactory` keeps a fixed-size window of rows for MATCH_RECOGNIZE, backed by a `@Nullable Object[]`. `MemoryEnumerator` pads it with `add(null)` once the input runs out, so that the last rows can still be read with their following context, and a slot that has not been written yet reads back as null either way. `add` takes `@Nullable E`, `Memory.get` returns it, and both type parameters take the nullable bound. Co-Authored-By: Claude Opus 5 --- .../java/org/apache/calcite/linq4j/MemoryFactory.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 78b4e83229cf..f6e759e4d958 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/MemoryFactory.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/MemoryFactory.java @@ -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)); From 8d1506cf1963b6a6b45a2293fc8b873ade4c2aef Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 11:38:53 +0300 Subject: [PATCH 13/60] [CALCITE-7736] Let the join enumerators carry the null rows they emit An outer join emits a row where one side is missing, and the merge and correlate joins build that row from a null. The types said otherwise. * `ExtendedEnumerable.correlateJoin` takes `Function2`. Its own javadoc already said "for semi/anti join inner argument is always null", and `EnumerableDefaults.correlateJoin` already declared the parameter that way. * `CartesianProductJoinEnumerator` accepts `Enumerator`, which is what a left join hands it as the single null inner row; its result selector already took `@Nullable TInner`. * `Linq4j.enumerator(Collection)` and `Linq4j.IterableEnumerator` take the nullable bound, so that null row can be enumerated at all. * Merge join widens its result selector before handing it to `nestedLoopJoin`, which serves right and full joins too and so requires one that tolerates a null left row. Merge join rejects those join types up front. `IterableEnumerator.moveNext` carries a NullAway suppression: assigning `Iterator.next()` to a field of type `T` is reported as assigning @Nullable to @NonNull, the same limitation the seeded `aggregate` hits. `WrapMap.get` and `remove` take a nullable key, as `Map` requires, and wrapping one throws. That is what the map did before it was annotated; `put` already carried the same suppression. With this, NullAway reports nothing in calcite-linq4j. Co-Authored-By: Claude Opus 5 --- .../calcite/linq4j/DefaultEnumerable.java | 2 +- .../calcite/linq4j/EnumerableDefaults.java | 24 ++++++++++++++----- .../calcite/linq4j/ExtendedEnumerable.java | 2 +- .../org/apache/calcite/linq4j/Linq4j.java | 8 +++++-- .../calcite/linq4j/QueryableRecorder.java | 1 + 5 files changed, 27 insertions(+), 10 deletions(-) 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 eccd6ab38e96..83b15374a997 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java @@ -472,7 +472,7 @@ protected OrderedQueryable asOrderedQueryable() { @Override public Enumerable correlateJoin( JoinType joinType, Function1> inner, - Function2 resultSelector) { + Function2 resultSelector) { return EnumerableDefaults.correlateJoin(joinType, getThis(), inner, resultSelector); } 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 71dc1e7315df..e7be128c5903 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java @@ -1030,7 +1030,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; @@ -4923,6 +4923,9 @@ 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)); } @@ -4932,6 +4935,7 @@ private Wrapped wrap(K key) { return map.put(wrap(key), value); } + @SuppressWarnings("NullAway") @Override public @Nullable V remove(@Nullable Object key) { return map.remove(wrap((K) key)); } @@ -5156,7 +5160,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()) { @@ -5211,10 +5216,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; @@ -5376,7 +5388,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/ExtendedEnumerable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java index 8136f645ec7a..4f81e441b86a 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java @@ -748,7 +748,7 @@ Enumerable correlateLeftMarkJoin( */ Enumerable correlateJoin( JoinType joinType, Function1> inner, - Function2 resultSelector); + Function2 resultSelector); /** * Returns the last element of a sequence. (Defined 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 b531f73fde04..99601dc19d2f 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java @@ -189,7 +189,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); @@ -430,7 +431,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 +449,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(); 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 1b164543bd38..aac25216f6c6 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableRecorder.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableRecorder.java @@ -257,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) { From caae6f69f78980c9c950c28a70d23e916aca6cda Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 12:06:17 +0300 Subject: [PATCH 14/60] [CALCITE-7736] Suppress the three do-nothing visitors `RexVisitorImpl`, `RexBiVisitorImpl` and `SqlBasicVisitor` are the traversals that subclasses extend and override where they care; every method they define returns null. That is meaningful only when the result type is instantiated nullable, which JSpecify cannot require: it tracks upper bounds, so `` says "may be" rather than "must be". The Checker Framework said it with `<@Nullable R>`, which constrains the lower bound. Same treatment as `Linq4j.SingletonNullEnumerator` and `Functions.Ignore`. Co-Authored-By: Claude Opus 5 --- .../main/java/org/apache/calcite/rex/RexBiVisitorImpl.java | 5 +++++ .../src/main/java/org/apache/calcite/rex/RexVisitorImpl.java | 5 +++++ .../java/org/apache/calcite/sql/util/SqlBasicVisitor.java | 5 +++++ 3 files changed, 15 insertions(+) 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 1ae39484bfc9..fa8e3a2db94f 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexBiVisitorImpl.java +++ b/core/src/main/java/org/apache/calcite/rex/RexBiVisitorImpl.java @@ -25,6 +25,11 @@ * @param Return type from each {@code visitXxx} method * @param

Payload type */ + +// 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 -------------------------------------------------------- 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 2bfb5972b66a..003b816c05a0 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexVisitorImpl.java +++ b/core/src/main/java/org/apache/calcite/rex/RexVisitorImpl.java @@ -26,6 +26,11 @@ * * @param Return type from each {@code visitXxx} method. */ + +// 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 -------------------------------------------------------- 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 8156b286e2e8..356f0e254fdc 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 @@ -36,6 +36,11 @@ * * @param Return type */ + +// 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 ---------------------------------------------------------------- From 9a30b370ba3bc41deae24bbed38508b1514a795b Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 12:06:17 +0300 Subject: [PATCH 15/60] [CALCITE-7736] Instantiate the result-ignoring visitors with @Nullable Void A visitor that computes nothing was written `RexVisitorImpl`. `Void` has null as its only value, so a non-null `Void` is a type nothing inhabits, and the traversal returns exactly the null it rules out. 68 sites across `RexVisitorImpl`, `RexVisitor`, `SqlBasicVisitor`, `SqlVisitor` and `RexBiVisitorImpl` now say `@Nullable Void`, including the parameters and fields that hold such a visitor. Co-Authored-By: Claude Opus 5 --- .idea/vcs.xml | 4 +- .../adapter/enumerable/EnumerableMatch.java | 2 +- .../calcite/adapter/jdbc/JdbcRules.java | 2 +- .../org/apache/calcite/plan/RelOptUtil.java | 4 +- .../calcite/plan/RexImplicationChecker.java | 2 +- .../java/org/apache/calcite/plan/Strong.java | 4 +- .../calcite/plan/SubstitutionVisitor.java | 4 +- .../org/apache/calcite/rel/core/Match.java | 4 +- .../rel/metadata/RelMdColumnOrigins.java | 4 +- .../calcite/rel/metadata/RelMdPredicates.java | 2 +- .../calcite/rel/rel2sql/SqlImplementor.java | 2 +- .../calcite/rel/rules/CalcRelSplitter.java | 8 ++-- .../calcite/rel/rules/DateRangeRules.java | 2 +- .../rel/rules/JoinExpandOrToUnionRule.java | 3 +- .../rel/rules/JoinToMultiJoinRule.java | 2 +- .../rel/rules/ProjectAggregateMergeRule.java | 3 +- .../rel/rules/ProjectTableScanRule.java | 3 +- .../rel/rules/ProjectToWindowRule.java | 3 +- .../calcite/rel/rules/PushProjector.java | 2 +- .../rel/rules/ReduceExpressionsRule.java | 2 +- .../org/apache/calcite/rex/RexAnalyzer.java | 4 +- .../apache/calcite/rex/RexMultisetUtil.java | 2 +- .../java/org/apache/calcite/rex/RexOver.java | 2 +- .../org/apache/calcite/rex/RexProgram.java | 4 +- .../apache/calcite/rex/RexProgramBuilder.java | 4 +- .../org/apache/calcite/rex/RexSimplify.java | 2 +- .../java/org/apache/calcite/rex/RexUtil.java | 42 +++++++++---------- .../java/org/apache/calcite/sql/SqlPivot.java | 2 +- .../org/apache/calcite/sql/SqlUnpivot.java | 2 +- .../java/org/apache/calcite/sql/SqlUtil.java | 6 +-- .../calcite/sql/fun/SqlBetweenOperator.java | 4 +- .../apache/calcite/sql/type/OperandTypes.java | 2 +- .../calcite/sql/validate/AggChecker.java | 4 +- .../calcite/sql/validate/AggVisitor.java | 2 +- .../sql/validate/SqlValidatorImpl.java | 16 +++---- .../apache/calcite/sql2rel/AggConverter.java | 2 +- .../calcite/sql2rel/RelDecorrelator.java | 6 +-- .../calcite/sql2rel/SqlToRelConverter.java | 2 +- .../java/org/apache/calcite/util/Util.java | 2 +- .../file/CsvProjectFilterTableScanRule.java | 5 ++- .../calcite/piglet/PigToSqlAggregateRule.java | 3 +- 41 files changed, 97 insertions(+), 83 deletions(-) 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/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMatch.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMatch.java index 1287d088d946..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 @@ -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/jdbc/JdbcRules.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcRules.java index a4f5a0d17e7b..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 @@ -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/plan/RelOptUtil.java b/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java index 815aae5a31fe..baec2a0c88c3 100644 --- a/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java +++ b/core/src/main/java/org/apache/calcite/plan/RelOptUtil.java @@ -4056,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; @@ -4704,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, 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 36dd368ec01e..08ca75dfe503 100644 --- a/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java +++ b/core/src/main/java/org/apache/calcite/plan/RexImplicationChecker.java @@ -441,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<>(); 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 402f872e3b98..db746bc797a9 100644 --- a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java +++ b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java @@ -1483,7 +1483,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 +1839,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/rel/core/Match.java b/core/src/main/java/org/apache/calcite/rel/core/Match.java index 09bfd9a1765e..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 @@ -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/metadata/RelMdColumnOrigins.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdColumnOrigins.java index efe93d1e039c..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 @@ -298,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/RelMdPredicates.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPredicates.java index b2330bff7718..125946ee6263 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 @@ -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/rel2sql/SqlImplementor.java b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java index 8b20523de493..bf7d92f02fd3 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 @@ -2480,7 +2480,7 @@ private boolean containsOver( return false; } final boolean[] result = {false}; - node.accept(new SqlBasicVisitor() { + node.accept(new SqlBasicVisitor<@Nullable Void>() { @Override public Void visit(SqlCall call) { if (result[0]) { return null; 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 f054c66b8ced..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 @@ -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; 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 d25b579de7f0..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 @@ -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/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/JoinToMultiJoinRule.java b/core/src/main/java/org/apache/calcite/rel/rules/JoinToMultiJoinRule.java index ec34f6e619d1..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 @@ -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/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/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 2bbcb54235b5..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 @@ -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/ReduceExpressionsRule.java b/core/src/main/java/org/apache/calcite/rel/rules/ReduceExpressionsRule.java index 3fc1a6fcd614..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 @@ -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/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/RexMultisetUtil.java b/core/src/main/java/org/apache/calcite/rex/RexMultisetUtil.java index 47252a1cde5a..c6d399fb6888 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexMultisetUtil.java +++ b/core/src/main/java/org/apache/calcite/rex/RexMultisetUtil.java @@ -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/RexOver.java b/core/src/main/java/org/apache/calcite/rex/RexOver.java index 89721bc84582..c8f2568ab0e9 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexOver.java +++ b/core/src/main/java/org/apache/calcite/rex/RexOver.java @@ -222,7 +222,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/RexProgram.java b/core/src/main/java/org/apache/calcite/rex/RexProgram.java index f90ab5010583..0f952a1bcb8d 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexProgram.java +++ b/core/src/main/java/org/apache/calcite/rex/RexProgram.java @@ -770,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()); @@ -995,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 74b109cfeb05..98ce0d41cbfd 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexProgramBuilder.java +++ b/core/src/main/java/org/apache/calcite/rex/RexProgramBuilder.java @@ -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/RexSimplify.java b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java index e7919a0ec595..7f88b46571f7 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java +++ b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java @@ -3172,7 +3172,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() { 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 b262194ca624..ed6ba5ef9c5f 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexUtil.java +++ b/core/src/main/java/org/apache/calcite/rex/RexUtil.java @@ -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/sql/SqlPivot.java b/core/src/main/java/org/apache/calcite/sql/SqlPivot.java index 00c50f883aef..89ecee5bdf3c 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlPivot.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlPivot.java @@ -175,7 +175,7 @@ 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() { + final SqlVisitor<@Nullable Void> nameCollector = new SqlBasicVisitor<@Nullable Void>() { @Override public 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/SqlUnpivot.java b/core/src/main/java/org/apache/calcite/sql/SqlUnpivot.java index d99815a0c62e..89aef8c420e2 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlUnpivot.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlUnpivot.java @@ -144,7 +144,7 @@ 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() { + final SqlVisitor<@Nullable Void> nameCollector = new SqlBasicVisitor<@Nullable Void>() { @Override public 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/SqlUtil.java b/core/src/main/java/org/apache/calcite/sql/SqlUtil.java index 74daa93de52a..a2de0dfc58fe 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlUtil.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlUtil.java @@ -1334,8 +1334,8 @@ public static boolean containsAgg(SqlNode node) { public static boolean containsCall(SqlNode node, Predicate callPredicate) { try { - SqlVisitor visitor = - new SqlBasicVisitor() { + SqlVisitor<@Nullable Void> visitor = + new SqlBasicVisitor<@Nullable Void>() { @Override public Void visit(SqlCall call) { if (callPredicate.test(call)) { throw new Util.FoundOne(call); @@ -1426,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; 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..321b5c54d19f 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,7 +265,7 @@ private static SqlBetweenOperator of(boolean negated, boolean symmetric) { /** * Finds an AND operator in an expression. */ - private static class AndFinder extends SqlBasicVisitor { + private static class AndFinder extends SqlBasicVisitor<@Nullable Void> { @Override public Void visit(SqlCall call) { final SqlOperator operator = call.getOperator(); if (operator == SqlStdOperatorTable.AND) { 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 c4912279d27a..58754538a125 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 @@ -2050,7 +2050,7 @@ 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) { 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..6fa0e7cb872a 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<>(); 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 2b1f51e9598f..6b93767d4496 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 @@ -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; 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 80b2974a1a6a..53408fe712eb 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 @@ -1782,7 +1782,7 @@ && requireNonNull(((SqlNumericLiteral) node).bigDecimalValue()) RESOURCE.offsetFetchValueMustNotBeNegative(kind)); } validateNoAggs(aggOrOverFinder, node, kind); - node.accept(new SqlBasicVisitor() { + node.accept(new SqlBasicVisitor<@Nullable Void>() { @Override public Void visit(SqlIdentifier id) { if (makeNullaryCall(id) != null) { return null; @@ -4579,7 +4579,7 @@ protected void validateSelect( */ private static void forEachQualified(SqlNode node, SqlValidatorScope scope, Consumer consumer) { - node.accept(new SqlBasicVisitor() { + node.accept(new SqlBasicVisitor<@Nullable Void>() { @Override public Void visit(SqlIdentifier id) { final SqlQualified qualified = scope.fullyQualify(id); consumer.accept(qualified); @@ -4593,7 +4593,7 @@ 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() { + node.accept(new SqlBasicVisitor<@Nullable Void>() { @Override public Void visit(SqlIdentifier id) { final SqlQualified qualified = scope.fullyQualify(id); if (bypassQualifieds.contains(qualified)) { @@ -6057,7 +6057,7 @@ 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() { + node.accept(new SqlBasicVisitor<@Nullable Void>() { @Override public Void visit(SqlIdentifier id) { if (!isOuterReference(currentScope, id)) { ok[0] = false; @@ -6082,7 +6082,7 @@ private boolean referencesOnlyOuterColumns(SqlNode node, */ private static boolean containsSubQuery(SqlNode node) { final boolean[] found = {false}; - node.accept(new SqlBasicVisitor() { + node.accept(new SqlBasicVisitor<@Nullable Void>() { @Override public Void visit(SqlCall call) { if (call.getKind().belongsTo(SqlKind.QUERY)) { found[0] = true; @@ -8004,7 +8004,7 @@ 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) { @@ -8921,8 +8921,8 @@ private void addOrdinal2ExpandSet( */ private boolean containsIdentifier(SqlNode sqlNode, SqlIdentifier target) { try { - SqlVisitor visitor = - new SqlBasicVisitor() { + SqlVisitor<@Nullable Void> visitor = + new SqlBasicVisitor<@Nullable Void>() { @Override public 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/sql2rel/AggConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/AggConverter.java index 6d77076484d6..fbdec67744c1 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/AggConverter.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/AggConverter.java @@ -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; 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 68f14f2701e7..72b66be88c68 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java @@ -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/SqlToRelConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java index 39270dddb5c7..e8235de88e51 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java @@ -6750,7 +6750,7 @@ 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<>(); 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 e8aefee5c0ad..23faa50b3f32 100644 --- a/core/src/main/java/org/apache/calcite/util/Util.java +++ b/core/src/main/java/org/apache/calcite/util/Util.java @@ -2896,7 +2896,7 @@ 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) { 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/piglet/src/main/java/org/apache/calcite/piglet/PigToSqlAggregateRule.java b/piglet/src/main/java/org/apache/calcite/piglet/PigToSqlAggregateRule.java index 71f206d09afc..cf3d46b752de 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; @@ -80,7 +81,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 From 2e438fff14a3541fb890111574407743f15240d5 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 12:11:23 +0300 Subject: [PATCH 16/60] [CALCITE-7736] Drop castNonNull calls whose argument is already non-null NullAway reports a `castToNonNull` whose argument it can already prove non-null, which is how it flags a cast that has stopped earning its place. 46 of them across 20 files, most in the `FlatLists` and `PairLists` constructors, where the elements arrive as non-null parameters. Co-Authored-By: Claude Opus 5 --- .../calcite/adapter/enumerable/EnumUtils.java | 4 ++-- .../apache/calcite/jdbc/CalcitePrepare.java | 2 +- .../apache/calcite/materialize/Lattice.java | 2 +- .../org/apache/calcite/plan/RelOptCluster.java | 6 ++---- .../apache/calcite/plan/volcano/RelSubset.java | 2 +- .../rel/metadata/RelMetadataQueryBase.java | 4 +--- .../calcite/rel/rel2sql/SqlImplementor.java | 2 +- .../materialize/MaterializedViewRule.java | 2 +- .../org/apache/calcite/rex/RexLiteral.java | 2 +- .../org/apache/calcite/runtime/FlatLists.java | 18 +++++++++--------- .../calcite/runtime/ImmutablePairList.java | 10 ++++------ .../org/apache/calcite/runtime/PairLists.java | 4 ++-- .../java/org/apache/calcite/sql/SqlCall.java | 4 +--- .../org/apache/calcite/sql/SqlOperator.java | 3 +-- .../sql/ddl/SqlCreateForeignSchema.java | 6 ++---- .../calcite/sql2rel/SqlToRelConverter.java | 2 +- .../org/apache/calcite/util/BuiltInMethod.java | 2 +- .../util/graph/DefaultDirectedGraph.java | 6 ++---- 18 files changed, 34 insertions(+), 47 deletions(-) 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 f7ad7cb14447..f621a2ed6995 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 @@ -294,7 +294,7 @@ static Expression joinSelectorCompact(JoinRelType joinType, PhysType physType, // Delegate copying the row values to JavaRowFormat final List copyStatements = Nullness.castNonNull( - inputPhysType.getFormat().copy(parameter, Nullness.castNonNull(compactOutputVar), + 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 @@ -309,7 +309,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(), 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 3c051292a7e3..b8f406379a7b 100644 --- a/core/src/main/java/org/apache/calcite/jdbc/CalcitePrepare.java +++ b/core/src/main/java/org/apache/calcite/jdbc/CalcitePrepare.java @@ -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/materialize/Lattice.java b/core/src/main/java/org/apache/calcite/materialize/Lattice.java index 6ce20e268f3d..98fc645e405f 100644 --- a/core/src/main/java/org/apache/calcite/materialize/Lattice.java +++ b/core/src/main/java/org/apache/calcite/materialize/Lattice.java @@ -1159,7 +1159,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/plan/RelOptCluster.java b/core/src/main/java/org/apache/calcite/plan/RelOptCluster.java index 6cc88b8c0b99..c4141bceb1cf 100644 --- a/core/src/main/java/org/apache/calcite/plan/RelOptCluster.java +++ b/core/src/main/java/org/apache/calcite/plan/RelOptCluster.java @@ -37,8 +37,6 @@ 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; /** @@ -111,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 @@ -193,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/volcano/RelSubset.java b/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java index 97cce4d58292..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 @@ -659,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/rel/metadata/RelMetadataQueryBase.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQueryBase.java index f4cc78fea47b..cb8840b0011c 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 @@ -27,8 +27,6 @@ import java.util.Map; import java.util.function.Supplier; -import static org.apache.calcite.linq4j.Nullness.castNonNull; - import static java.util.Objects.requireNonNull; /** @@ -120,7 +118,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/rel2sql/SqlImplementor.java b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java index bf7d92f02fd3..31cd78c94d6d 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 @@ -1739,7 +1739,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 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 20215f7796f5..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 @@ -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/rex/RexLiteral.java b/core/src/main/java/org/apache/calcite/rex/RexLiteral.java index fb2987de49f5..89394da3edce 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLiteral.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLiteral.java @@ -755,7 +755,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)))); 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 9b3a0fbddf8e..9a7d2366fff4 100644 --- a/core/src/main/java/org/apache/calcite/runtime/FlatLists.java +++ b/core/src/main/java/org/apache/calcite/runtime/FlatLists.java @@ -407,7 +407,7 @@ protected static class Flat1List } @Override public @Nullable Object[] toArray(Flat1List<@Nullable T> this) { - return new Object[] {castNonNull(t0)}; + return new Object[] {t0}; } @Override public int compareTo(List o) { @@ -540,7 +540,7 @@ protected static class Flat2List } @Override public @Nullable Object[] toArray(Flat2List<@Nullable T> this) { - return new Object[] {castNonNull(t0), castNonNull(t1)}; + return new Object[] {t0, t1}; } @Override public int compareTo(List o) { @@ -690,7 +690,7 @@ protected static class Flat3List } @Override public @Nullable Object[] toArray(Flat3List<@Nullable T> this) { - return new Object[] {castNonNull(t0), castNonNull(t1), castNonNull(t2)}; + return new Object[] {t0, t1, t2}; } @Override public int compareTo(List o) { @@ -859,8 +859,8 @@ protected static class Flat4List } @Override public @Nullable Object[] toArray(Flat4List<@Nullable T> this) { - return new Object[] {castNonNull(t0), castNonNull(t1), castNonNull(t2), - castNonNull(t3)}; + return new Object[] {t0, t1, t2, + t3}; } @Override public int compareTo(List o) { @@ -1048,8 +1048,8 @@ protected static class Flat5List } @Override public @Nullable Object[] toArray(Flat5List<@Nullable T> this) { - return new Object[] {castNonNull(t0), castNonNull(t1), castNonNull(t2), - castNonNull(t3), castNonNull(t4)}; + return new Object[] {t0, t1, t2, + t3, t4}; } @Override public int compareTo(List o) { @@ -1257,8 +1257,8 @@ protected static class Flat6List } @Override public @Nullable Object[] toArray(Flat6List<@Nullable T> this) { - return new Object[] {castNonNull(t0), castNonNull(t1), castNonNull(t2), - castNonNull(t3), castNonNull(t4), castNonNull(t5)}; + return new Object[] {t0, t1, t2, + t3, t4, t5}; } @Override public int compareTo(List o) { 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 97c44108bc78..b77d6d9a5b17 100644 --- a/core/src/main/java/org/apache/calcite/runtime/ImmutablePairList.java +++ b/core/src/main/java/org/apache/calcite/runtime/ImmutablePairList.java @@ -23,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. @@ -88,8 +86,8 @@ static ImmutablePairList copyOf( 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); } @@ -98,8 +96,8 @@ static ImmutablePairList copyOf( // 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/PairLists.java b/core/src/main/java/org/apache/calcite/runtime/PairLists.java index 1e5fb9196c97..2fd096f691fa 100644 --- a/core/src/main/java/org/apache/calcite/runtime/PairLists.java +++ b/core/src/main/java/org/apache/calcite/runtime/PairLists.java @@ -56,8 +56,8 @@ static ImmutablePairList immutableBackedBy( return ImmutablePairList.of(); case 2: return new SingletonImmutablePairList<>( - castNonNull((T) list.get(0)), - castNonNull((U) list.get(1))); + (T) list.get(0), + (U) list.get(1)); default: return new ArrayImmutablePairList<>(list.toArray()); } 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 001cef2b48e6..701ad8761a87 100755 --- a/core/src/main/java/org/apache/calcite/sql/SqlCall.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlCall.java @@ -33,8 +33,6 @@ import java.util.Collection; import java.util.List; -import static org.apache.calcite.linq4j.Nullness.castNonNull; - import static java.util.Objects.requireNonNull; /** @@ -103,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() { 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 b1edc4e57f54..12dad78c287c 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlOperator.java @@ -47,7 +47,6 @@ 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; @@ -625,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 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 5e945d2066aa..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 @@ -39,8 +39,6 @@ import static com.google.common.base.Preconditions.checkArgument; -import static org.apache.calcite.linq4j.Nullness.castNonNull; - import static java.util.Objects.requireNonNull; /** @@ -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/sql2rel/SqlToRelConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java index e8235de88e51..71f431ea8a38 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java @@ -1044,7 +1044,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(project.getProjects().get(i).accept(shuttle)); } } bb.setRoot( 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 390efb81ee01..e4bd92f0527c 100644 --- a/core/src/main/java/org/apache/calcite/util/BuiltInMethod.java +++ b/core/src/main/java/org/apache/calcite/util/BuiltInMethod.java @@ -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/graph/DefaultDirectedGraph.java b/core/src/main/java/org/apache/calcite/util/graph/DefaultDirectedGraph.java index d55298a8fc2c..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 @@ -31,8 +31,6 @@ import java.util.Map; import java.util.Set; -import static org.apache.calcite.linq4j.Nullness.castNonNull; - /** * Default implementation of {@link DirectedGraph}. * @@ -221,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)); } } From b618b5d522094809545aca4ba794c7999535099f Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 12:55:21 +0300 Subject: [PATCH 17/60] [CALCITE-7736] Let the PairList implementations hold nullable pairs `PairList` is declared ``, but the classes in `PairLists` that implement it, and the `MapEntry` they hand back, declared plain ``. A nullable type argument was therefore rejected at every one of them. `MutablePairList` keeps both halves of every pair in one `List<@Nullable Object>`, so the element type cannot carry the nullability of T and of U separately, and reading a slot back produced a `@Nullable` value at 26 call sites. They now go through one `element` helper that explains the packing and carries the suppression, rather than each site arguing the point. `backingList` answers with `Arrays.asList` and `Collections.emptyList` instead of `ImmutableList`, which rejects a `@Nullable` element type. The array-backed implementation already answered that way. Co-Authored-By: Claude Opus 5 --- .../org/apache/calcite/runtime/MapEntry.java | 3 +- .../org/apache/calcite/runtime/PairLists.java | 82 +++++++++++-------- 2 files changed, 52 insertions(+), 33 deletions(-) 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 1021d76b5ac5..209d1c552758 100644 --- a/core/src/main/java/org/apache/calcite/runtime/MapEntry.java +++ b/core/src/main/java/org/apache/calcite/runtime/MapEntry.java @@ -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/PairLists.java b/core/src/main/java/org/apache/calcite/runtime/PairLists.java index 2fd096f691fa..81a05292fa95 100644 --- a/core/src/main/java/org/apache/calcite/runtime/PairLists.java +++ b/core/src/main/java/org/apache/calcite/runtime/PairLists.java @@ -27,6 +27,7 @@ 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<>( - (T) list.get(0), - (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; From ff73a5df13358c5ef43be1986eb58c17f7868ef7 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 13:37:16 +0300 Subject: [PATCH 18/60] [CALCITE-7736] Let select and its siblings produce a nullable result `select` maps each element through a function, and the function is free to return null: `SqlFunctions` does exactly that when it projects a column that may be absent. The `` type parameter said otherwise on `ExtendedEnumerable`, `ExtendedQueryable`, `QueryableFactory`, `EnumerableDefaults` and the classes that implement them, so a nullable type argument was rejected at the call. Adds the nullable bound to every `` and `` method in linq4j, and to the two overrides of those methods in core. Co-Authored-By: Claude Opus 5 --- .../calcite/adapter/enumerable/EnumUtils.java | 2 +- .../calcite/prepare/QueryableRelBuilder.java | 10 +++++----- .../apache/calcite/linq4j/DefaultEnumerable.java | 12 +++++++----- .../apache/calcite/linq4j/DefaultQueryable.java | 11 ++++++----- .../apache/calcite/linq4j/EnumerableDefaults.java | 10 +++++----- .../calcite/linq4j/EnumerableQueryable.java | 11 ++++++----- .../apache/calcite/linq4j/ExtendedEnumerable.java | 11 ++++++----- .../apache/calcite/linq4j/ExtendedQueryable.java | 10 +++++----- .../java/org/apache/calcite/linq4j/Linq4j.java | 4 ++-- .../java/org/apache/calcite/linq4j/Lookup.java | 4 +++- .../org/apache/calcite/linq4j/LookupImpl.java | 2 +- .../apache/calcite/linq4j/QueryableDefaults.java | 2 +- .../apache/calcite/linq4j/QueryableFactory.java | 10 +++++----- .../apache/calcite/linq4j/QueryableRecorder.java | 15 ++++++++++----- 14 files changed, 63 insertions(+), 51 deletions(-) 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 f621a2ed6995..2126947961b5 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 @@ -1415,7 +1415,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/prepare/QueryableRelBuilder.java b/core/src/main/java/org/apache/calcite/prepare/QueryableRelBuilder.java index 6ce1fbd1414f..99d24d98a873 100644 --- a/core/src/main/java/org/apache/calcite/prepare/QueryableRelBuilder.java +++ b/core/src/main/java/org/apache/calcite/prepare/QueryableRelBuilder.java @@ -501,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(); } @@ -543,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); @@ -554,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/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java index 83b15374a997..f2d2741ea132 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java @@ -601,7 +601,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); } @@ -630,21 +631,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 d60bba500bf1..24eadff4af92 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultQueryable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultQueryable.java @@ -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/EnumerableDefaults.java b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java index e7be128c5903..425ea1f81589 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java @@ -3202,7 +3202,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, @@ -3399,7 +3399,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()) { @@ -3435,7 +3435,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() { @@ -3474,7 +3474,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() { @@ -3520,7 +3520,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() { 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 0c777684556d..e0ec59f7c328 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableQueryable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableQueryable.java @@ -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/ExtendedEnumerable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java index 4f81e441b86a..171b3e7d9303 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java @@ -956,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 @@ -996,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); /** @@ -1010,7 +1011,7 @@ Enumerable select( * {@code Enumerable} and flattens the resulting sequences into one * sequence. */ - Enumerable selectMany( + Enumerable selectMany( Function1> selector); /** @@ -1019,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/ExtendedQueryable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedQueryable.java index d9716d8d76ed..7fb59d19bda3 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedQueryable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedQueryable.java @@ -445,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); @@ -488,7 +488,7 @@ OrderedQueryable orderByDescending( /** * Projects each element of a sequence into a new form. */ - Queryable select( + Queryable select( FunctionExpression> selector); /** @@ -498,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); @@ -507,7 +507,7 @@ Queryable selectN( * {@code Enumerable} and combines the resulting sequences into one * sequence. */ - Queryable selectMany( + Queryable selectMany( FunctionExpression>> selector); /** @@ -519,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/Linq4j.java b/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java index 99601dc19d2f..9d4cdbf0fbd6 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java @@ -249,7 +249,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); } @@ -285,7 +285,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); } 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 277daa1fbc37..3e3c5a841bdd 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/LookupImpl.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/LookupImpl.java @@ -181,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/QueryableDefaults.java b/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableDefaults.java index eab9a894aeef..d35de9c3b056 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableDefaults.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableDefaults.java @@ -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 b2a6750c4458..27357d88fded 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableFactory.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableFactory.java @@ -523,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); @@ -566,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); @@ -582,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); /** @@ -591,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 aac25216f6c6..c3b7cb615e97 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableRecorder.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/QueryableRecorder.java @@ -630,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) { @@ -687,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) { @@ -700,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) { @@ -709,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) { @@ -718,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) { From d3cbfc674ccfea2a6ae2e2d608649d6ca7372de3 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 13:53:07 +0300 Subject: [PATCH 19/60] [CALCITE-7736] Let the SQL collection helpers carry null elements A SQL array or multiset may hold nulls, and an outer join hands the adapter a null collection outright, so the types these helpers work with have to say so. * `Functions.compareLists` and `compareMaps` accept `? extends @Nullable Object` * `Linq4j.product` gives its element type a nullable bound * the two outer-join adapters in `SqlFunctions` take `@Nullable List<@Nullable Object>` rather than `List`, which is what they were already handed * `mapFromEntries` builds a `Map<@Nullable Object, @Nullable Object>` rather than a raw one * `IS_JDK_8` reads `java.version`, which is always set, through `requireNonNull` `ArrayCartesianProductEnumerable` calls `toArray` through a lambda rather than a method reference, because the JDK model reports one signature at a call site and requires another in an override. Co-Authored-By: Claude Opus 5 --- .../apache/calcite/runtime/SqlFunctions.java | 19 ++++++++++--------- .../org/apache/calcite/linq4j/Linq4j.java | 4 ++-- .../calcite/linq4j/function/Functions.java | 6 ++++-- 3 files changed, 16 insertions(+), 13 deletions(-) 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 59b93888772b..71f79aa6b3e8 100644 --- a/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java +++ b/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java @@ -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); @@ -273,7 +273,7 @@ private static class ArrayCartesianProductEnumerable } @Override public Enumerator<@Nullable Object[]> enumerator() { - return Linq4j.transform(product, List::toArray); + return Linq4j.transform(product, list -> list.toArray()); } } @@ -332,7 +332,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() { } @@ -7499,7 +7500,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)); } @@ -7508,7 +7509,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; @@ -7523,7 +7524,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]; 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 9d4cdbf0fbd6..e2951e08c21a 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java @@ -386,13 +386,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<>(); 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 6f8ffd84cc6e..b66b3b4e9b3f 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 @@ -714,7 +714,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; } @@ -735,7 +736,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; } From 2e53e54680dc384e7e828df90a065d3a1b2b9f47 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 14:22:49 +0300 Subject: [PATCH 20/60] [CALCITE-7736] Let the null-tolerant collection helpers take nullable elements `ImmutableNullableList` exists to hold nulls, and `Pair` is declared ``. Their static factories said otherwise: a static method declares type parameters of its own, and these had none, so a nullable element was rejected at every call. * `ImmutableNullableList`, its three `copyOf` overloads and `builder`. The inner `Builder` already had the bound, which is why `builder()` returning `Builder` could not feed a `Builder<@Nullable Double>`. * the 16 remaining statics on `Pair`: `zip`, `toMap`, `forEach`, `forEachIndexed`, `adjacents`, `firstAnd` and the rest. Together these account for 62 of the findings, most of them in `RelMdSize`, which computes a size per column and has no size for some of them. Co-Authored-By: Claude Opus 5 --- .../calcite/util/ImmutableNullableList.java | 10 +++---- .../java/org/apache/calcite/util/Pair.java | 30 +++++++++++-------- 2 files changed, 23 insertions(+), 17 deletions(-) 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 26408597114f..d40f825b887b 100644 --- a/core/src/main/java/org/apache/calcite/util/ImmutableNullableList.java +++ b/core/src/main/java/org/apache/calcite/util/ImmutableNullableList.java @@ -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) { @@ -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) { @@ -198,7 +198,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<>(); } 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 3f1099a8c376..104d9c65eabe 100644 --- a/core/src/main/java/org/apache/calcite/util/Pair.java +++ b/core/src/main/java/org/apache/calcite/util/Pair.java @@ -88,7 +88,8 @@ public Pair(T1 left, T2 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()); } @@ -149,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); @@ -167,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); } @@ -183,7 +186,7 @@ public static List> zip(List ks, List List> zip( + public static List> zip( final List ks, final List vs, boolean strict) { @@ -209,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 () -> { @@ -231,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>() { @@ -252,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); @@ -273,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) { @@ -286,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(); @@ -298,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; @@ -308,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); } @@ -323,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) { From 7b53ff90ef2f2971636471d48c21ad4a30261c3e Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 14:38:22 +0300 Subject: [PATCH 21/60] [CALCITE-7736] Let SqlFunctions carry the nulls that SQL values have The runtime works on SQL arrays, multisets and maps, whose elements and values are nullable, and on rows whose fields may be absent. The types said otherwise. * `Linq4j.asEnumerable` gives its element type a nullable bound, at all four overloads: viewing a collection as an `Enumerable` should not lose the fact that it holds nulls * `Functions.compareMaps` accepts a nullable key type as well as a nullable value type, which is what a cast `(Map)` produces * `FlatLists.ofSingle` and `of(List)` take nullable elements. They build a `Flat1List` and a flat list, both of which already admit them * `flatListOuter` takes `@Nullable List<@Nullable Object>`, which is what an outer join hands it, and its body already tested for null * `mapFromString` builds `Map`: a pair with no separator has no value. `slice` collects `structAccess` results, which are null for an absent field Three locals that hold a `toArray()` result are declared `@Nullable Object[]`, and say why (uber/NullAway#1728). Co-Authored-By: Claude Opus 5 --- .../java/org/apache/calcite/runtime/FlatLists.java | 4 ++-- .../org/apache/calcite/runtime/SqlFunctions.java | 13 ++++++++----- .../main/java/org/apache/calcite/linq4j/Linq4j.java | 10 ++++++---- .../apache/calcite/linq4j/function/Functions.java | 4 ++-- 4 files changed, 18 insertions(+), 13 deletions(-) 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 9a7d2366fff4..69c59b8f7c24 100644 --- a/core/src/main/java/org/apache/calcite/runtime/FlatLists.java +++ b/core/src/main/java/org/apache/calcite/runtime/FlatLists.java @@ -66,7 +66,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); } @@ -225,7 +225,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); } 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 71f79aa6b3e8..10c3843321ad 100644 --- a/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java +++ b/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java @@ -7291,7 +7291,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) " @@ -7572,7 +7572,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); @@ -7636,7 +7636,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)); } @@ -7857,7 +7857,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) @@ -8262,7 +8263,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/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java b/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java index e2951e08c21a..118b91eccbca 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java @@ -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)); } 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 b66b3b4e9b3f..bfeb100b63f7 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 @@ -736,8 +736,8 @@ public static int compareLists(List b0, * *

    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; } From 0e867644e89c3b48ea06f00c1ad3915bfdd802ea Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 14:50:32 +0300 Subject: [PATCH 22/60] [CALCITE-7736] Let the shared utilities take nullable arguments Six utilities that everything else calls declared type parameters without a nullable bound, so a nullable argument was rejected at every call. * `Ord` holds a nullable element type; its seven statics now say so * `PairList`'s seven statics, matching the interface they build * `Util.firstDuplicate`, which compares elements rather than dereferencing them * `SqlOperator.acceptCall`, both overloads, and `SqlBasicVisitor.ArgHandler.instance`: a visitor result may be nullable, and `acceptCall` passes it through `Util.first` is the Elvis operator: its result is non-null when the fallback is, which `@Contract("_, !null -> !null")` states and NullAway verifies. Callers in `RelBuilder`, `SqlValidatorImpl` and `ModelHandler` relied on that. `Ord.zip(Iterator)` suppresses one finding: `next()` on an `Iterator` reads as `@Nullable E` when `E` has a nullable upper bound (uber/NullAway#1727). 91 findings. Co-Authored-By: Claude Opus 5 --- .../org/apache/calcite/runtime/PairList.java | 17 +++++++++------- .../org/apache/calcite/sql/SqlOperator.java | 4 ++-- .../calcite/sql/util/SqlBasicVisitor.java | 2 +- .../java/org/apache/calcite/util/Util.java | 5 +++-- .../java/org/apache/calcite/linq4j/Ord.java | 20 ++++++++++++------- 5 files changed, 29 insertions(+), 19 deletions(-) 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 5199d1cf0fb7..667d7cb76839 100644 --- a/core/src/main/java/org/apache/calcite/runtime/PairList.java +++ b/core/src/main/java/org/apache/calcite/runtime/PairList.java @@ -42,13 +42,13 @@ 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); @@ -56,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)); } @@ -71,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); @@ -87,7 +90,7 @@ static PairList of(Map map) { } /** Creates a Builder. */ - static Builder builder() { + static Builder builder() { return new Builder<>(); } 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 12dad78c287c..4ac84ac892b4 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlOperator.java @@ -947,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; @@ -972,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, 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 356f0e254fdc..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 @@ -111,7 +111,7 @@ public static class ArgHandlerImpl implements ArgHan 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/util/Util.java b/core/src/main/java/org/apache/calcite/util/Util.java index 23faa50b3f32..c1fd0b0795de 100644 --- a/core/src/main/java/org/apache/calcite/util/Util.java +++ b/core/src/main/java/org/apache/calcite/util/Util.java @@ -2127,7 +2127,8 @@ public static List> pairs(final List list) { * *

    Equivalent to the Elvis operator ({@code ?:}) of languages such as * Groovy or PHP. */ - public static @Nullable T first(@Nullable T v0, @Nullable T v1) { + @Contract("_, !null -> !null") + public static @Nullable T first(@Nullable T v0, @Nullable T v1) { return v0 != null ? v0 : v1; } @@ -2271,7 +2272,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. 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 55baf3fc2af4..1428cc239965 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Ord.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Ord.java @@ -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; From 978eae2877ccc11542710c5892e5fa1e39a50042 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 14:59:49 +0300 Subject: [PATCH 23/60] [CALCITE-7736] Let the utility collections and visitors carry nulls Eight files, all saying that a value cannot be null where it can. * `ImmutableIntList.toArray`, both overrides, match the JDK signature ` T[] toArray(T[] a)` and stop casting the argument back to non-null to read its length. Same as `FlatLists` and `ConsList`. * `RexNode.accept(RexBiVisitor, P)` and the `P` of `RexBiVisitor` and `RexBiVisitorImpl` take a nullable bound. `LogicVisitor` returns a nullable `Logic`, and could not be passed to its own `accept`. * `Util.skip`, `SqlParserUtil.replaceSublist` and `ResultSetEnumerable.of` join the statics that carry the bound of the type they work on. * `ArrayTable` reads a column whose values may be null into a list and an array that say so. `Permutation.isValid` loses `@RequiresNonNull({"sources", "targets"})`: both are `int[]`, and a primitive array is never null, so the precondition the Checker Framework needed during construction states nothing NullAway does not know. `JdbcTypeImpl` is suppressed and says why. Its `XXX_NULLABLE` constants return null for a null column, and cannot say so: the enum implements `JdbcType` raw, because a constant cannot carry its own type argument. Co-Authored-By: Claude Opus 5 --- .../java/org/apache/calcite/adapter/clone/ArrayTable.java | 4 ++-- .../main/java/org/apache/calcite/rex/RexBiVisitor.java | 2 +- .../java/org/apache/calcite/rex/RexBiVisitorImpl.java | 3 ++- core/src/main/java/org/apache/calcite/rex/RexNode.java | 3 ++- .../org/apache/calcite/runtime/ResultSetEnumerable.java | 4 ++-- .../java/org/apache/calcite/sql/parser/SqlParserUtil.java | 2 +- .../java/org/apache/calcite/util/ImmutableIntList.java | 8 ++++---- .../main/java/org/apache/calcite/util/JdbcTypeImpl.java | 5 ++++- .../main/java/org/apache/calcite/util/Permutation.java | 2 -- core/src/main/java/org/apache/calcite/util/Util.java | 4 ++-- 10 files changed, 20 insertions(+), 17 deletions(-) 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 5b36539fd028..bf77da18da5f 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 @@ -280,7 +280,7 @@ 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); + final List<@Nullable Comparable> list = permuteList(valueSet.values, sources); return list.toArray(new Comparable[0]); } @@ -438,7 +438,7 @@ public static class ObjectDictionary implements Representation { 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) { 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 37dd7745c73b..2babccb7b337 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexBiVisitor.java +++ b/core/src/main/java/org/apache/calcite/rex/RexBiVisitor.java @@ -32,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 fa8e3a2db94f..fe03069548f6 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexBiVisitorImpl.java +++ b/core/src/main/java/org/apache/calcite/rex/RexBiVisitorImpl.java @@ -30,7 +30,8 @@ // 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 { +public class RexBiVisitorImpl + implements RexBiVisitor { //~ Instance fields -------------------------------------------------------- protected final boolean deep; 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 3112e03fee54..11f5eb9f1c6c 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexNode.java +++ b/core/src/main/java/org/apache/calcite/rex/RexNode.java @@ -113,7 +113,8 @@ public int nodeCount() { * 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/runtime/ResultSetEnumerable.java b/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java index 6db07d360740..c9370153a833 100644 --- a/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java +++ b/core/src/main/java/org/apache/calcite/runtime/ResultSetEnumerable.java @@ -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/sql/parser/SqlParserUtil.java b/core/src/main/java/org/apache/calcite/sql/parser/SqlParserUtil.java index ca47e878b6ff..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 @@ -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/util/ImmutableIntList.java b/core/src/main/java/org/apache/calcite/util/ImmutableIntList.java index 49427ff66d3b..0be7eee90bd5 100644 --- a/core/src/main/java/org/apache/calcite/util/ImmutableIntList.java +++ b/core/src/main/java/org/apache/calcite/util/ImmutableIntList.java @@ -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/JdbcTypeImpl.java b/core/src/main/java/org/apache/calcite/util/JdbcTypeImpl.java index 3ae906b0cbc6..aafd9a5ddf53 100644 --- a/core/src/main/java/org/apache/calcite/util/JdbcTypeImpl.java +++ b/core/src/main/java/org/apache/calcite/util/JdbcTypeImpl.java @@ -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/Permutation.java b/core/src/main/java/org/apache/calcite/util/Permutation.java index f93c97b273ec..58ba67b1d72e 100644 --- a/core/src/main/java/org/apache/calcite/util/Permutation.java +++ b/core/src/main/java/org/apache/calcite/util/Permutation.java @@ -16,7 +16,6 @@ */ package org.apache.calcite.util; -import org.apache.calcite.linq4j.annotations.RequiresNonNull; import org.apache.calcite.util.mapping.IntPair; import org.apache.calcite.util.mapping.Mapping; import org.apache.calcite.util.mapping.MappingType; @@ -435,7 +434,6 @@ private void setInternal(int source, int target) { * @param fail Whether to assert if invalid * @return Whether valid */ - @RequiresNonNull({"sources", "targets"}) private boolean isValid(boolean fail) { final int size = targets.length; if (sources.length != size) { 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 c1fd0b0795de..a8c5b4d9de9b 100644 --- a/core/src/main/java/org/apache/calcite/util/Util.java +++ b/core/src/main/java/org/apache/calcite/util/Util.java @@ -2221,12 +2221,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()); } From 62b878adf16861c44eac574e1c9904397ea049d2 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 15:08:13 +0300 Subject: [PATCH 24/60] [CALCITE-7736] Drop the preconditions that only the Checker Framework needed `@RequiresNonNull` states which nullable fields a caller must have checked. `RexLiteral.computeDigest`, `RexLiteral.digestIncludesType` and `Resources.Prop.getDefault` named fields that are `final` and non-null: `RexLiteral.type` and `typeName`, and `Resources.Element.method`. The Checker Framework needed them because the methods run while the object is still under construction, which it tracked and NullAway does not. Under NullAway the annotations state nothing new and reject every caller. Same reason `Permutation.isValid` lost its own in the previous commit. Also here: the 16 overrides of `RexNode.accept(RexBiVisitor, P)` take the bounds the abstract method now has, and `ImmutableNullableList.of`, all eight overloads, joins `copyOf` and `builder` in admitting the nulls the class exists to hold. `JdbcUtils` builds its connection key from a url, user, password and driver class, of which only the url is required. 42 findings. Co-Authored-By: Claude Opus 5 --- .../apache/calcite/adapter/jdbc/JdbcUtils.java | 3 ++- .../java/org/apache/calcite/rex/RexCall.java | 3 ++- .../apache/calcite/rex/RexCorrelVariable.java | 3 ++- .../org/apache/calcite/rex/RexDynamicParam.java | 3 ++- .../org/apache/calcite/rex/RexFieldAccess.java | 3 ++- .../org/apache/calcite/rex/RexInputRef.java | 3 ++- .../java/org/apache/calcite/rex/RexLambda.java | 3 ++- .../org/apache/calcite/rex/RexLambdaRef.java | 3 ++- .../java/org/apache/calcite/rex/RexLiteral.java | 6 ++---- .../org/apache/calcite/rex/RexLocalRef.java | 3 ++- .../calcite/rex/RexNodeAndFieldIndex.java | 3 ++- .../java/org/apache/calcite/rex/RexOver.java | 3 ++- .../apache/calcite/rex/RexPatternFieldRef.java | 3 ++- .../org/apache/calcite/rex/RexRangeRef.java | 3 ++- .../org/apache/calcite/rex/RexSimplify.java | 3 ++- .../org/apache/calcite/rex/RexSubQuery.java | 3 ++- .../apache/calcite/rex/RexTableInputRef.java | 3 ++- .../org/apache/calcite/runtime/Resources.java | 2 -- .../calcite/util/ImmutableNullableList.java | 17 +++++++++-------- 19 files changed, 43 insertions(+), 30 deletions(-) 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 5243ca6da207..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 @@ -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/rex/RexCall.java b/core/src/main/java/org/apache/calcite/rex/RexCall.java index bba28f275361..f2c17fc9df1a 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexCall.java +++ b/core/src/main/java/org/apache/calcite/rex/RexCall.java @@ -196,7 +196,8 @@ private boolean digestWithType() { 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/RexCorrelVariable.java b/core/src/main/java/org/apache/calcite/rex/RexCorrelVariable.java index 95b5ff1294c8..2148e85e9852 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexCorrelVariable.java +++ b/core/src/main/java/org/apache/calcite/rex/RexCorrelVariable.java @@ -51,7 +51,8 @@ public class RexCorrelVariable extends RexVariable { 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 aa011a46494b..629fc4a9d89d 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexDynamicParam.java +++ b/core/src/main/java/org/apache/calcite/rex/RexDynamicParam.java @@ -60,7 +60,8 @@ public int getIndex() { 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/RexFieldAccess.java b/core/src/main/java/org/apache/calcite/rex/RexFieldAccess.java index 7db5629ec2a0..6182cec013db 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexFieldAccess.java +++ b/core/src/main/java/org/apache/calcite/rex/RexFieldAccess.java @@ -103,7 +103,8 @@ public RelDataTypeField getField() { 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 79492da8ce91..a86a3a4e3737 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexInputRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexInputRef.java @@ -125,7 +125,8 @@ public static void add2(PairList list, 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/RexLambda.java b/core/src/main/java/org/apache/calcite/rex/RexLambda.java index 31a5d7c9d850..3c59bb76725c 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLambda.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLambda.java @@ -59,7 +59,8 @@ public class RexLambda extends RexNode { 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 edde8abc1405..4688405d00cb 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLambdaRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLambdaRef.java @@ -40,7 +40,8 @@ public RexLambdaRef(int index, String name, RelDataType type) { return visitor.visitLambdaRef(this); } - @Override public R accept(RexBiVisitor visitor, P arg) { + @Override public R accept( + RexBiVisitor visitor, P arg) { return (R) null; } 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 89394da3edce..95054884323b 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLiteral.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLiteral.java @@ -21,7 +21,6 @@ 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.annotations.RequiresNonNull; import org.apache.calcite.linq4j.function.Functions; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.type.RelDataType; @@ -276,7 +275,6 @@ public class RexLiteral extends RexNode { * @param includeType whether the digest should include type or not * @return digest */ - @RequiresNonNull({"typeName", "type"}) public final String computeDigest( RexDigestIncludeType includeType) { if (includeType == RexDigestIncludeType.OPTIONAL) { @@ -303,7 +301,6 @@ public final String computeDigest( * @see RexCall#computeDigest(boolean) * @return whether {@link RexDigestIncludeType} digest would include data type */ - @RequiresNonNull("type") RexDigestIncludeType digestIncludesType() { return shouldIncludeType(value, type); } @@ -1341,7 +1338,8 @@ public static boolean isNullLiteral(RexNode node) { 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 bb5e1b6d3367..d9d3a9b07af6 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLocalRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLocalRef.java @@ -78,7 +78,8 @@ public RexLocalRef(int index, RelDataType type) { 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/RexNodeAndFieldIndex.java b/core/src/main/java/org/apache/calcite/rex/RexNodeAndFieldIndex.java index be03733d45e1..fc2cf355cda2 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexNodeAndFieldIndex.java +++ b/core/src/main/java/org/apache/calcite/rex/RexNodeAndFieldIndex.java @@ -78,7 +78,8 @@ public int getFieldIndex() { 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 c8f2568ab0e9..4336ae9e42d3 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexOver.java +++ b/core/src/main/java/org/apache/calcite/rex/RexOver.java @@ -156,7 +156,8 @@ public boolean ignoreNulls() { 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); } 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 7543b63a8bfe..a991a6894fb4 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexPatternFieldRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexPatternFieldRef.java @@ -49,7 +49,8 @@ public static RexPatternFieldRef of(String alpha, RexInputRef ref) { 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/RexRangeRef.java b/core/src/main/java/org/apache/calcite/rex/RexRangeRef.java index 845cb071d9ec..c1a117774500 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexRangeRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexRangeRef.java @@ -75,7 +75,8 @@ public int getOffset() { 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/RexSimplify.java b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java index 7f88b46571f7..1c67e373be1f 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java +++ b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java @@ -3731,7 +3731,8 @@ > Sarg build(boolean negate) { 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/RexSubQuery.java b/core/src/main/java/org/apache/calcite/rex/RexSubQuery.java index 02a16ad0f02d..b2cbf9c0985c 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexSubQuery.java +++ b/core/src/main/java/org/apache/calcite/rex/RexSubQuery.java @@ -164,7 +164,8 @@ public static RexSubQuery map(RelNode rel) { 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 432c5c7fc612..7a62ce7fdffa 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexTableInputRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexTableInputRef.java @@ -89,7 +89,8 @@ public static RexTableInputRef of(RelTableRef tableRef, RexInputRef ref) { 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/runtime/Resources.java b/core/src/main/java/org/apache/calcite/runtime/Resources.java index 3ff86dcd42f0..5770b5ee11b6 100644 --- a/core/src/main/java/org/apache/calcite/runtime/Resources.java +++ b/core/src/main/java/org/apache/calcite/runtime/Resources.java @@ -18,7 +18,6 @@ import org.apache.calcite.linq4j.annotations.Contract; import org.jspecify.annotations.Nullable; -import org.apache.calcite.linq4j.annotations.RequiresNonNull; import java.io.IOException; import java.io.InputStream; @@ -624,7 +623,6 @@ protected Prop(PropertyAccessor accessor, Method method) { this.hasDefault = resource != null; } - @RequiresNonNull("method") protected final @Nullable Default getDefault() { if (hasDefault) { return castNonNull(method.getAnnotation(Default.class)); 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 d40f825b887b..4ca730415f0a 100644 --- a/core/src/main/java/org/apache/calcite/util/ImmutableNullableList.java +++ b/core/src/main/java/org/apache/calcite/util/ImmutableNullableList.java @@ -122,55 +122,56 @@ private ImmutableNullableList(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]; From 8d4b4269ac0cc5b636154c8815047af26d8d16f4 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 15:19:19 +0300 Subject: [PATCH 25/60] [CALCITE-7736] Say what the guards already check, and drop two more dead preconditions `canBeLong` answers `o instanceof Boolean || ...`, which is false for null. `@Contract("null -> false")` states that, and NullAway narrows the caller in `ColumnLoader` accordingly, where a dropped `@EnsuresNonNullIf` used to. `LoptMultiJoin` loses `@RequiresNonNull` from six methods: `joinStart` and `nFieldsInJoinFactor` are `int[]`, and a primitive array is never null. Same as `Permutation`, `RexLiteral` and `Resources`. `LoptOptimizeJoinRule` reads each table out of `simpleFactors` once, through `requireNonNull`, rather than looking the same key up three times. The keys come from that map, which a dropped `@KeyFor` used to say. `ChunkList` packs the neighbouring chunks into slots 0 and 1 of the element array, so those two writes are suppressed and say why. The two places that narrow a chunk reference now assign the result of `castNonNull` instead of casting the same nullable local at each use. `CalciteConnectionConfigImpl` suppresses its six plugin accessors: `getPlugin` comes from Avatica, which is not annotated, so NullAway cannot infer one `T` that suits both the `Class` argument and a nullable default. The `@Contract` on each stays, and NullAway verifies it. Three lambdas in `ColumnLoader` drop their explicit parameter type, which was non-null where the functional interface says nullable. Co-Authored-By: Claude Opus 5 --- .../calcite/adapter/clone/ColumnLoader.java | 8 +++++--- .../config/CalciteConnectionConfigImpl.java | 18 ++++++++++++++++++ .../calcite/rel/rules/LoptMultiJoin.java | 4 ---- .../rel/rules/LoptOptimizeJoinRule.java | 10 +++++++--- .../org/apache/calcite/util/ChunkList.java | 15 ++++++++------- 5 files changed, 38 insertions(+), 17 deletions(-) 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 6cf1c3489d25..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,6 +21,7 @@ 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; @@ -250,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; @@ -262,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; @@ -273,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: @@ -384,6 +385,7 @@ private static long toLong(Object o) { } } + @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/config/CalciteConnectionConfigImpl.java b/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfigImpl.java index 9410d0e33488..baf46bce2da2 100644 --- a/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfigImpl.java +++ b/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfigImpl.java @@ -107,6 +107,9 @@ public boolean isSet(CalciteConnectionProperty property) { } @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 = @@ -155,6 +158,9 @@ public boolean isSet(CalciteConnectionProperty property) { } @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) @@ -162,6 +168,9 @@ public boolean isSet(CalciteConnectionProperty property) { } @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) @@ -183,6 +192,9 @@ public boolean isSet(CalciteConnectionProperty property) { } @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) @@ -225,6 +237,9 @@ public boolean isSet(CalciteConnectionProperty property) { } @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, @Nullable T defaultMetaTableFactory) { @@ -233,6 +248,9 @@ public boolean isSet(CalciteConnectionProperty property) { } @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, @Nullable T defaultMetaColumnFactory) { 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 979dff18ffd4..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 @@ -444,7 +444,6 @@ public void setJoinRemovalSemiJoin(int dimIdx, LogicalJoin semiJoin) { * * @return the bitmap containing the factor references */ - @RequiresNonNull({"joinStart", "nFieldsInJoinFactor"}) ImmutableBitSet getJoinFilterFactorBitmap( RexNode joinFilter, boolean setFields) { @@ -466,7 +465,6 @@ private static ImmutableBitSet fieldBitmap(RexNode joinFilter) { * Sets bitmaps indicating which factors and fields each join filter * references. */ - @RequiresNonNull({"allJoinFilters", "joinStart", "nFieldsInJoinFactor"}) private void setJoinFilterRefs() { ListIterator filterIter = allJoinFilters.listIterator(); while (filterIter.hasNext()) { @@ -491,7 +489,6 @@ private void setJoinFilterRefs() { * @return bitmap representing factors referenced that will * be set by this method */ - @RequiresNonNull({"joinStart", "nFieldsInJoinFactor"}) private ImmutableBitSet factorBitmap( ImmutableBitSet fieldRefBitmap) { ImmutableBitSet.Builder factorRefBitmap = ImmutableBitSet.builder(); @@ -509,7 +506,6 @@ private ImmutableBitSet factorBitmap( * * @return index corresponding to join factor */ - @RequiresNonNull({"joinStart", "nFieldsInJoinFactor"}) public int findRef( int rexInputRef) { for (int i = 0; i < nJoinFactors; 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 f3cd00bd2385..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 @@ -316,10 +316,14 @@ private static void findRemovableSelfJoins(RelMetadataQuery mq, LoptMultiJoin mu for (int j = i + 1; j < factors.length; j++) { int leftFactor = factors[i]; int rightFactor = factors[j]; - if (simpleFactors.get(leftFactor).getQualifiedName().equals( - simpleFactors.get(rightFactor).getQualifiedName())) { + 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/util/ChunkList.java b/core/src/main/java/org/apache/calcite/util/ChunkList.java index 148eae85f575..47af033dcfc7 100644 --- a/core/src/main/java/org/apache/calcite/util/ChunkList.java +++ b/core/src/main/java/org/apache/calcite/util/ChunkList.java @@ -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); } From db69bff31e5e1f35f7462a5ed05e30b7e38cf047 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 15:38:07 +0300 Subject: [PATCH 26/60] [CALCITE-7736] Take the nullable bound on the acceptCall overrides, and two more dead preconditions Nine overrides of `SqlOperator.acceptCall` take the bound the base method got two commits ago. A visitor result may be nullable, and `acceptCall` passes it through. Four `InvocationHandler.invoke` implementations move the annotation from the elements to the array: `@Nullable Object @Nullable [] args`. The JDK passes null for `args` when the proxied method declares no parameters, which is what the deleted `InvocationHandler.astub` used to say. `ReflectiveConvertletTable.map` and `SimpleProfiler.Run.columns` are `final` and non-null, so the `@RequiresNonNull` naming them stated nothing and rejected their callers. Co-Authored-By: Claude Opus 5 --- .../main/java/org/apache/calcite/profile/SimpleProfiler.java | 3 --- .../calcite/rel/metadata/CachingRelMetadataProvider.java | 4 ++-- .../calcite/rel/metadata/ChainedRelMetadataProvider.java | 4 ++-- core/src/main/java/org/apache/calcite/sql/SqlAsOperator.java | 4 +++- .../main/java/org/apache/calcite/sql/SqlMatchRecognize.java | 2 +- .../src/main/java/org/apache/calcite/sql/SqlOverOperator.java | 4 +++- .../main/java/org/apache/calcite/sql/SqlSelectOperator.java | 2 +- core/src/main/java/org/apache/calcite/sql/SqlSnapshot.java | 2 +- core/src/main/java/org/apache/calcite/sql/SqlWindow.java | 2 +- .../java/org/apache/calcite/sql/fun/SqlColonOperator.java | 4 +++- .../java/org/apache/calcite/sql/fun/SqlConvertFunction.java | 2 +- .../main/java/org/apache/calcite/sql/fun/SqlDotOperator.java | 4 +++- .../org/apache/calcite/sql2rel/ReflectiveConvertletTable.java | 3 --- .../org/apache/calcite/util/BarfingInvocationHandler.java | 2 +- .../org/apache/calcite/util/DelegatingInvocationHandler.java | 2 +- 15 files changed, 23 insertions(+), 21 deletions(-) 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 0e38205f143c..92baaca63233 100644 --- a/core/src/main/java/org/apache/calcite/profile/SimpleProfiler.java +++ b/core/src/main/java/org/apache/calcite/profile/SimpleProfiler.java @@ -17,7 +17,6 @@ package org.apache.calcite.profile; import org.apache.calcite.linq4j.Ord; -import org.apache.calcite.linq4j.annotations.RequiresNonNull; import org.apache.calcite.materialize.Lattice; import org.apache.calcite.rel.metadata.NullSentinel; import org.apache.calcite.runtime.FlatLists; @@ -291,8 +290,6 @@ private boolean hasNull(ImmutableBitSet columnOrdinals) { } return false; } - - @RequiresNonNull("columns") private ImmutableSortedSet toColumns( Iterable ordinals) { //noinspection Convert2MethodRef 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 a9c7d1f726fa..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 @@ -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 aac5f5b09daa..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 @@ -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/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/SqlMatchRecognize.java b/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java index 338652fe4faf..36cdab245311 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlMatchRecognize.java @@ -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/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/SqlSelectOperator.java b/core/src/main/java/org/apache/calcite/sql/SqlSelectOperator.java index 4dbce066e598..36fb6ce2066d 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlSelectOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlSelectOperator.java @@ -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/SqlSnapshot.java b/core/src/main/java/org/apache/calcite/sql/SqlSnapshot.java index 09de8dd059af..6ce1cf163729 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlSnapshot.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlSnapshot.java @@ -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/SqlWindow.java b/core/src/main/java/org/apache/calcite/sql/SqlWindow.java index f960fe856300..11215bd50760 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlWindow.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlWindow.java @@ -933,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/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 c0a23611a23a..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 @@ -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/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/sql2rel/ReflectiveConvertletTable.java b/core/src/main/java/org/apache/calcite/sql2rel/ReflectiveConvertletTable.java index 1e2e2cc90316..1d89431d0804 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/ReflectiveConvertletTable.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/ReflectiveConvertletTable.java @@ -16,7 +16,6 @@ */ package org.apache.calcite.sql2rel; -import org.apache.calcite.linq4j.annotations.RequiresNonNull; import org.apache.calcite.rex.RexNode; import org.apache.calcite.sql.SqlCall; import org.apache.calcite.sql.SqlNode; @@ -63,7 +62,6 @@ 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( final Method method) { if (!isPublic(method)) { @@ -105,7 +103,6 @@ private void registerNodeTypeMethod( * types: ConvertletContext; SqlOperator (or a subtype), SqlCall (or a * subtype). */ - @RequiresNonNull("map") private void registerOpTypeMethod( final Method method) { if (!isPublic(method)) { 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 1bec8d98139c..0f0e02cf0907 100644 --- a/core/src/main/java/org/apache/calcite/util/BarfingInvocationHandler.java +++ b/core/src/main/java/org/apache/calcite/util/BarfingInvocationHandler.java @@ -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/DelegatingInvocationHandler.java b/core/src/main/java/org/apache/calcite/util/DelegatingInvocationHandler.java index bc305a62c287..5d237632150e 100644 --- a/core/src/main/java/org/apache/calcite/util/DelegatingInvocationHandler.java +++ b/core/src/main/java/org/apache/calcite/util/DelegatingInvocationHandler.java @@ -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 { From fbf361455790bdbf2d5ec10cadfcea15a5c675b5 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 16:00:20 +0300 Subject: [PATCH 27/60] [CALCITE-7736] Read the nulls the JDK hands out, and restore two narrowings Four proxy invocation handlers index `args`, which the JDK leaves null when the proxied method declares no parameters, so they read it through `requireNonNull`. Three places declare a `toArray()` result `@Nullable Object[]`, which is what the JDK model gives them. `Util.LINE_SEPARATOR` and `FILE_SEPARATOR` read properties that are always set, and `toUrl` reads `file.separator` a second time rather than the constant it already has. `deepEquals0` used to narrow its argument through `@EnsuresNonNullIf`, which NullAway supports for fields only, so the three `deepEquals` in `LogicalFilter`, `LogicalJoin` and `LogicalAsofJoin` say `requireNonNull` instead. `SqlBinaryOperator` and `SqlTypeUtil` ask for a charset after `inCharFamily` has established there is one. Co-Authored-By: Claude Opus 5 --- .../org/apache/calcite/rel/logical/LogicalAsofJoin.java | 3 ++- .../java/org/apache/calcite/rel/logical/LogicalFilter.java | 2 +- .../java/org/apache/calcite/rel/logical/LogicalJoin.java | 2 +- .../calcite/rel/metadata/JaninoRelMetadataProvider.java | 3 ++- .../rel/metadata/ProxyingMetadataHandlerProvider.java | 2 +- .../apache/calcite/rel/metadata/RelMetadataQueryBase.java | 3 ++- .../main/java/org/apache/calcite/sql/SqlBinaryOperator.java | 2 +- .../main/java/org/apache/calcite/sql/type/SqlTypeUtil.java | 5 ++++- core/src/main/java/org/apache/calcite/util/Compatible.java | 3 ++- .../java/org/apache/calcite/util/ImmutableNullableList.java | 2 +- core/src/main/java/org/apache/calcite/util/Util.java | 6 +++--- 11 files changed, 20 insertions(+), 13 deletions(-) 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 d6935607e384..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 @@ -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 9703f76fbf74..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 @@ -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 ee24239828bf..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 @@ -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/metadata/JaninoRelMetadataProvider.java b/core/src/main/java/org/apache/calcite/rel/metadata/JaninoRelMetadataProvider.java index b7df1a707856..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 @@ -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/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/RelMetadataQueryBase.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMetadataQueryBase.java index cb8840b0011c..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 @@ -95,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()); })); } 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 3bdf92e31e01..34b1cb7cf928 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlBinaryOperator.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlBinaryOperator.java @@ -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/type/SqlTypeUtil.java b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeUtil.java index 507325349d62..a2e8d170daf0 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 @@ -1394,7 +1394,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/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/ImmutableNullableList.java b/core/src/main/java/org/apache/calcite/util/ImmutableNullableList.java index 4ca730415f0a..1d186cbe0945 100644 --- a/core/src/main/java/org/apache/calcite/util/ImmutableNullableList.java +++ b/core/src/main/java/org/apache/calcite/util/ImmutableNullableList.java @@ -67,7 +67,7 @@ private ImmutableNullableList(E[] 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); } 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 a8c5b4d9de9b..7b8e533e3639 100644 --- a/core/src/main/java/org/apache/calcite/util/Util.java +++ b/core/src/main/java/org/apache/calcite/util/Util.java @@ -140,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 @@ -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 != '/') { From 6efaac34bc8a62b06dd890c2121d183891fe828c Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 16:07:22 +0300 Subject: [PATCH 28/60] [CALCITE-7736] Let the values that are genuinely absent say so `UnboundMetadata.bind` answers null when the provider has no metadata for a node, which three implementations already did and none declared. `LazyReference` holds nothing until its supplier has run, so its `AtomicReference` is `<@Nullable T>` and the two `(T) null` casts go away. `jsonObjectAggAdd` and `jsonArrayAggAdd` took a raw `Map` and `List` and put null into them, which is what SQL/JSON asks for under NULL ON NULL. They now take `Map` and `List<@Nullable Object>`. `Utilities.compare` is suppressed: its `Comparator` parameter is raw, so NullAway checks the call against the erased `compare(Object, Object)`, while a SQL comparator is exactly the thing that orders nulls. `Matcher` casts the row at offset 0 of the memory window, which is the one the predicate has just accepted. The window itself is padded with nulls at either end, which is why `Memory.get` is nullable. Co-Authored-By: Claude Opus 5 --- .../org/apache/calcite/rel/metadata/UnboundMetadata.java | 2 +- .../java/org/apache/calcite/runtime/JsonFunctions.java | 5 +++-- .../src/main/java/org/apache/calcite/runtime/Matcher.java | 7 +++++-- .../main/java/org/apache/calcite/runtime/Utilities.java | 1 + .../main/java/org/apache/calcite/util/LazyReference.java | 8 +++++--- 5 files changed, 15 insertions(+), 8 deletions(-) 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 a4ac28ccc047..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 @@ -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/runtime/JsonFunctions.java b/core/src/main/java/org/apache/calcite/runtime/JsonFunctions.java index 5bb16adf62fa..a3e6b0c273dd 100644 --- a/core/src/main/java/org/apache/calcite/runtime/JsonFunctions.java +++ b/core/src/main/java/org/apache/calcite/runtime/JsonFunctions.java @@ -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) { 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 347a6887dc12..699db8eee7bf 100644 --- a/core/src/main/java/org/apache/calcite/runtime/Matcher.java +++ b/core/src/main/java/org/apache/calcite/runtime/Matcher.java @@ -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/Utilities.java b/core/src/main/java/org/apache/calcite/runtime/Utilities.java index 186630240add..148f2acca4f7 100644 --- a/core/src/main/java/org/apache/calcite/runtime/Utilities.java +++ b/core/src/main/java/org/apache/calcite/runtime/Utilities.java @@ -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/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); } } From c3d48f21ff8c94625805e02e3e763b70cb6cb15e Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 16:16:18 +0300 Subject: [PATCH 29/60] [CALCITE-7736] Type the collections and results that hold absent values A run of one-off corrections, all of the same shape: a value that can be absent was flowing into a type that said it could not. * `Collections.nCopies(n, null)` builds a list of absent values, in `ProfilerImpl` twice and `AggregateReduceFunctionsRule` * `CacheUtil` returns what `toArray()` gives it, `@Nullable Object[]` * `EnumerableTableModify` keys an update by a source row, whose column values may be null * `RexSimplify.evaluate` returns a value or an exception, exactly one of which is set, so both halves of the `Pair` are nullable * `RelToSqlConverter` collects into a list that becomes a `SqlNodeList` * `SerializableCharset.readObject` reads back what `writeObject` wrote, and `DelegatingScope` looks up a key it took from the map's own key set * `EnumerableWindow` asks for an offset after ruling out CURRENT ROW, which is the case that has none `SqlNode.toList` and `RelMdColumnUniqueness` replace a method reference with a lambda. A reference resolves against the JDK model, which disagrees with the functional interface it is being assigned to; a lambda is inferred from the target type instead. Co-Authored-By: Claude Opus 5 --- .../adapter/enumerable/EnumerableTableModify.java | 6 ++++-- .../calcite/adapter/enumerable/EnumerableWindow.java | 4 ++-- .../java/org/apache/calcite/profile/ProfilerImpl.java | 10 +++++----- .../calcite/rel/metadata/RelMdColumnUniqueness.java | 4 +--- .../apache/calcite/rel/metadata/janino/CacheUtil.java | 6 ++++-- .../apache/calcite/rel/rel2sql/RelToSqlConverter.java | 6 +++--- .../rel/rules/AggregateReduceFunctionsRule.java | 2 +- .../main/java/org/apache/calcite/rex/RexSimplify.java | 9 ++++++--- core/src/main/java/org/apache/calcite/sql/SqlNode.java | 2 +- .../apache/calcite/sql/validate/DelegatingScope.java | 2 +- .../org/apache/calcite/util/SerializableCharset.java | 2 +- 11 files changed, 29 insertions(+), 24 deletions(-) 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 49528837b52b..2c926b66092a 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 @@ -227,7 +227,8 @@ public static long applyUpdateOneToOne(Enumerable source, List 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); } @@ -516,7 +517,8 @@ public static void applyDeleteRowsByKey(Enumerable sourceKeys, * @return key for row */ private static List keyOf(Object[] rowValues) { - return Arrays.asList(Arrays.copyOf(rowValues, rowValues.length)); + return Arrays.<@Nullable Object>asList( + Arrays.copyOf(rowValues, rowValues.length)); } } 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 5a0ffc62afc3..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 @@ -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/profile/ProfilerImpl.java b/core/src/main/java/org/apache/calcite/profile/ProfilerImpl.java index 6a9337c6af73..81448756bcaf 100644 --- a/core/src/main/java/org/apache/calcite/profile/ProfilerImpl.java +++ b/core/src/main/java/org/apache/calcite/profile/ProfilerImpl.java @@ -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. @@ -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); 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 8fb570305b8c..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; @@ -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/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/rel2sql/RelToSqlConverter.java b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java index 2d0f8c56b231..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 @@ -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/rules/AggregateReduceFunctionsRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateReduceFunctionsRule.java index d0e1a86bab03..c8f145acede6 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 @@ -262,7 +262,7 @@ private void reduceAggs( relBuilder.project(inputExprs, CompositeList.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/rex/RexSimplify.java b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java index 1c67e373be1f..ca95b1a7a71e 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexSimplify.java +++ b/core/src/main/java/org/apache/calcite/rex/RexSimplify.java @@ -2472,7 +2472,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 { @@ -2516,8 +2517,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); 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 c34e27515e93..270d842825c0 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlNode.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlNode.java @@ -384,7 +384,7 @@ 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, + ArrayList::new, (list, e) -> list.add(e), Util::combine, (ArrayList<@Nullable SqlNode> list) -> SqlNodeList.of(pos, list)); } } 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 8cbbe69db3cb..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 @@ -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/util/SerializableCharset.java b/core/src/main/java/org/apache/calcite/util/SerializableCharset.java index 262c43d7822a..924830979eae 100644 --- a/core/src/main/java/org/apache/calcite/util/SerializableCharset.java +++ b/core/src/main/java/org/apache/calcite/util/SerializableCharset.java @@ -71,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); From 9d5de4ee7fb44c3ab0324e7fc10544aa280cafd0 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 16:31:03 +0300 Subject: [PATCH 30/60] [CALCITE-7736] Let unwrap say it may find nothing, and split two contract guards `SqlValidatorNamespace.unwrap` answers null when the namespace is not of the requested type, which `AbstractNamespace` has always done and neither it nor `DelegatingNamespace` declared. Six call sites in `SqlValidatorImpl` and `SqlValidatorUtil` ask through `requireNonNull`; each has already established the type it is asking for. `NumberUtil.add` and `RelMdPercentageOriginalRows.quotientForPercentage` write one `if` per argument rather than `if (a == null || b == null)`, so that no control-flow merge precedes the `return null`. `CheckContracts` treats a return reached by a merge as reachable even when every incoming edge is not, and reports the `@Contract("!null, !null -> !null")` as violated. Reported as uber/NullAway#1731, see nullaway-bugs/contract-check-misses-merged-guard.md. The other 108 contracts in the codebase verify without complaint. Also: `TryThreadLocal.of` and `Functions.generate` take the nullable bound of the type they build, and `Prepare.THREAD_INSUBQUERY_THRESHOLD` holds a threshold that may be unset. Co-Authored-By: Claude Opus 5 --- core/src/main/java/org/apache/calcite/DataContext.java | 4 +++- .../calcite/adapter/enumerable/EnumerableTableModify.java | 2 +- .../src/main/java/org/apache/calcite/prepare/Prepare.java | 2 +- .../apache/calcite/rel/metadata/MetadataFactoryImpl.java | 4 +++- .../calcite/rel/metadata/RelMdPercentageOriginalRows.java | 8 +++++++- .../org/apache/calcite/rel/rel2sql/SqlImplementor.java | 6 ++++-- .../main/java/org/apache/calcite/rex/RexLambdaRef.java | 5 ++++- core/src/main/java/org/apache/calcite/runtime/Hook.java | 4 +++- .../apache/calcite/sql/validate/DelegatingNamespace.java | 2 +- .../org/apache/calcite/sql/validate/SqlValidatorImpl.java | 8 +++++--- .../calcite/sql/validate/SqlValidatorNamespace.java | 2 +- .../org/apache/calcite/sql/validate/SqlValidatorUtil.java | 7 ++++--- .../src/main/java/org/apache/calcite/util/NumberUtil.java | 8 +++++++- .../main/java/org/apache/calcite/util/TryThreadLocal.java | 2 +- .../org/apache/calcite/linq4j/function/Functions.java | 2 +- 15 files changed, 46 insertions(+), 20 deletions(-) diff --git a/core/src/main/java/org/apache/calcite/DataContext.java b/core/src/main/java/org/apache/calcite/DataContext.java index 82f0823ee424..43a025fc2b90 100644 --- a/core/src/main/java/org/apache/calcite/DataContext.java +++ b/core/src/main/java/org/apache/calcite/DataContext.java @@ -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/adapter/enumerable/EnumerableTableModify.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableTableModify.java index 2c926b66092a..07eca16cb917 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 @@ -223,7 +223,7 @@ 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(); 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 89a516e6b4c5..0e6be4cfe01f 100644 --- a/core/src/main/java/org/apache/calcite/prepare/Prepare.java +++ b/core/src/main/java/org/apache/calcite/prepare/Prepare.java @@ -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/rel/metadata/MetadataFactoryImpl.java b/core/src/main/java/org/apache/calcite/rel/metadata/MetadataFactoryImpl.java index 18444466ea06..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 @@ -29,6 +29,8 @@ 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. @@ -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/RelMdPercentageOriginalRows.java b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdPercentageOriginalRows.java index f6f3b587bcff..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 @@ -239,7 +239,13 @@ public Double getPercentageOriginalRows(Union rel, RelMetadataQuery mq) { private static @Nullable Double quotientForPercentage( @Nullable Double numerator, @Nullable Double denominator) { - if ((numerator == null) || (denominator == null)) { + // 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/rel2sql/SqlImplementor.java b/core/src/main/java/org/apache/calcite/rel/rel2sql/SqlImplementor.java index 31cd78c94d6d..0d18cde092de 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 @@ -1319,7 +1319,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); } } @@ -1327,7 +1328,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); } } 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 4688405d00cb..e68ee4ab329e 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexLambdaRef.java +++ b/core/src/main/java/org/apache/calcite/rex/RexLambdaRef.java @@ -23,6 +23,8 @@ import java.util.Objects; +import static org.apache.calcite.linq4j.Nullness.castNonNull; + /** * Variable that references a field of a lambda expression. */ @@ -42,7 +44,8 @@ public RexLambdaRef(int index, String name, RelDataType type) { @Override public R accept( RexBiVisitor visitor, P arg) { - return (R) null; + // 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/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/sql/validate/DelegatingNamespace.java b/core/src/main/java/org/apache/calcite/sql/validate/DelegatingNamespace.java index f00939874d3b..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 @@ -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/SqlValidatorImpl.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java index 53408fe712eb..8058d8c4c710 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 @@ -1237,7 +1237,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( @@ -7830,7 +7830,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)); @@ -7845,7 +7846,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()); 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 8e4efe31b850..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 @@ -182,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/SqlValidatorUtil.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorUtil.java index cd5ff191a194..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 @@ -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() 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 4ced1cbf04bd..7891d4b4bae7 100644 --- a/core/src/main/java/org/apache/calcite/util/NumberUtil.java +++ b/core/src/main/java/org/apache/calcite/util/NumberUtil.java @@ -151,7 +151,13 @@ public static long round(double d) { /** Returns the sum of two numbers, or null if either is null. */ @Contract("!null, !null -> !null") public static @Nullable Double add(@Nullable Double a, @Nullable Double b) { - if (a == null || b == null) { + // 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; } 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 cc601dcdd14e..47c3158314d6 100644 --- a/core/src/main/java/org/apache/calcite/util/TryThreadLocal.java +++ b/core/src/main/java/org/apache/calcite/util/TryThreadLocal.java @@ -35,7 +35,7 @@ public abstract class TryThreadLocal extends ThreadL * * @param initialValue Initial value */ - public static TryThreadLocal of(S initialValue) { + public static TryThreadLocal of(S initialValue) { return new FixedTryThreadLocal<>(initialValue); } 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 bfeb100b63f7..c042d3f494d5 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 @@ -374,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(); From 0b4d95af66571b28d817c532f64faa9267ca34f1 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 16:42:35 +0300 Subject: [PATCH 31/60] [CALCITE-7736] Ask for what is already established, and let the expression lists hold nulls `getNamespaceOrThrow(node).unwrap(XNamespace.class)` asks for a namespace kind the caller has just built, at five places in `SqlValidatorImpl`, and now says so with `requireNonNull` rather than relying on the declaration `unwrap` no longer makes. `Expressions.list` takes a nullable element bound, at all three overloads: a generated expression list holds a null comparer when the row type needs none. Five `Util.first(physType.comparer(), ...)` calls move to `firstNonNull`, whose fallback is a constant expression. `ArrayTable` permutes a column into an array that keeps the column's nulls. `SqlRowOperator` reads a field name once rather than testing one call and using another, `FormatModels` checks the match it just found, and `CalciteConnectionImpl` reads `user.name`, which is not guaranteed. Co-Authored-By: Claude Opus 5 --- .../calcite/adapter/clone/ArrayTable.java | 4 +-- .../enumerable/EnumerableHashJoin.java | 6 ++-- .../enumerable/EnumerableMergeJoin.java | 2 +- .../enumerable/EnumerableMergeUnion.java | 2 +- .../calcite/jdbc/CalciteConnectionImpl.java | 3 +- .../calcite/sql/fun/SqlRowOperator.java | 5 ++-- .../sql/validate/SqlValidatorImpl.java | 29 +++++++++++++++---- .../calcite/util/format/FormatModels.java | 2 +- .../calcite/linq4j/tree/Expressions.java | 6 ++-- 9 files changed, 39 insertions(+), 20 deletions(-) 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 bf77da18da5f..08872f02747f 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 @@ -281,13 +281,13 @@ 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<@Nullable Comparable> list = permuteList(valueSet.values, sources); - return list.toArray(new Comparable[0]); + return list.toArray(new @Nullable Comparable[0]); } @Override public Object permute(Object dataSet, int[] sources) { @Nullable Comparable[] list = (@Nullable Comparable[]) dataSet; final int size = list.length; - final @Nullable Comparable[] comparables = new Comparable[size]; + final @Nullable Comparable[] comparables = new @Nullable Comparable[size]; for (int i = 0; i < size; i++) { comparables[i] = list[sources[i]]; } 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 3ed56bfcb72c..7a169aaf0b2c 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 @@ -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()); 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 e4222961fbf6..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 @@ -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/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/jdbc/CalciteConnectionImpl.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteConnectionImpl.java index b3d5a69a3f6c..244e6b1adb03 100644 --- a/core/src/main/java/org/apache/calcite/jdbc/CalciteConnectionImpl.java +++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteConnectionImpl.java @@ -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/sql/fun/SqlRowOperator.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlRowOperator.java index c2abcdc30942..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 @@ -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/validate/SqlValidatorImpl.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java index 8058d8c4c710..fe164cbcdf6c 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 @@ -4479,7 +4479,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 @@ -7077,7 +7079,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(); @@ -7115,7 +7119,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 @@ -7368,7 +7377,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 @@ -7444,7 +7458,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 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/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Expressions.java b/linq4j/src/main/java/org/apache/calcite/linq4j/tree/Expressions.java index 48916d4a7a8b..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 @@ -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)); } From 600f708467956e4999669466edb7f8cb31c9c022 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 17:14:52 +0300 Subject: [PATCH 32/60] [CALCITE-7736] Say where a value is genuinely absent, and work around the bytecode wildcard `VolcanoPlanner.normalizePlan` reads a group after `find()` has succeeded, `MatchNode` names the row it reads at end of stream, `DataContexts.MapDataContext` maps a name to a value that may be absent, and `SqlBasicCall.set` copies a list whose elements may be null into an array that says so. `SqlNodeList` and `SubstitutionVisitor` suppress `containsAll`, `removeAll` and `retainAll`. An unbounded wildcard read from a bytecode signature behaves as `? extends Object` and rejects a nullable type argument, while the same `Collection` written in annotated source accepts one. Reported as uber/NullAway#1732, see nullaway-bugs/bytecode-unbounded-wildcard-rejects-nullable.md. `SubstitutionVisitor` puts the suppression on one `removeParents` helper rather than on the constructor that calls it twice. Co-Authored-By: Claude Opus 5 --- .../java/org/apache/calcite/DataContexts.java | 4 ++-- .../apache/calcite/interpreter/MatchNode.java | 4 +++- .../calcite/plan/SubstitutionVisitor.java | 22 +++++++++++++++++-- .../calcite/plan/volcano/VolcanoPlanner.java | 3 ++- .../org/apache/calcite/sql/SqlBasicCall.java | 2 +- .../org/apache/calcite/sql/SqlNodeList.java | 12 ++++++++++ 6 files changed, 40 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/org/apache/calcite/DataContexts.java b/core/src/main/java/org/apache/calcite/DataContexts.java index 03d0316f711d..ada6afe8e177 100644 --- a/core/src/main/java/org/apache/calcite/DataContexts.java +++ b/core/src/main/java/org/apache/calcite/DataContexts.java @@ -83,9 +83,9 @@ private static class EmptyDataContext implements DataContext, Serializable { * value for a key, remove the key from the map; the effect will be the * same. */ private static class MapDataContext extends EmptyDataContext { - private final ImmutableMap map; + private final ImmutableMap map; - MapDataContext(Map map) { + MapDataContext(Map map) { this.map = ImmutableMap.copyOf(map); } diff --git a/core/src/main/java/org/apache/calcite/interpreter/MatchNode.java b/core/src/main/java/org/apache/calcite/interpreter/MatchNode.java index f330a86038bb..b3cfb1f4ea18 100644 --- a/core/src/main/java/org/apache/calcite/interpreter/MatchNode.java +++ b/core/src/main/java/org/apache/calcite/interpreter/MatchNode.java @@ -18,6 +18,8 @@ import org.apache.calcite.rel.core.Match; +import org.jspecify.annotations.Nullable; + /** * Interpreter node that implements a * {@link Match}. @@ -28,7 +30,7 @@ public class MatchNode extends AbstractSingleNode { } @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/plan/SubstitutionVisitor.java b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java index db746bc797a9..b82f73b12f5b 100644 --- a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java +++ b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java @@ -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); } 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 6f2b73379df9..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 @@ -1513,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/sql/SqlBasicCall.java b/core/src/main/java/org/apache/calcite/sql/SqlBasicCall.java index 01af35095ee4..c98e69b2a76d 100755 --- a/core/src/main/java/org/apache/calcite/sql/SqlBasicCall.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlBasicCall.java @@ -140,7 +140,7 @@ public void setOperator(SqlOperator operator) { 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/SqlNodeList.java b/core/src/main/java/org/apache/calcite/sql/SqlNodeList.java index 7283f3bdc652..8820f16fd3fa 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlNodeList.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlNodeList.java @@ -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); } @@ -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); } From 08625f3025314e2cc5e139d30da18de839a18f50 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 17:27:38 +0300 Subject: [PATCH 33/60] [CALCITE-7736] Let the profiled rows and composed lists hold absent values A profiled row carries a value per column, and a column may have none, so `Collector.add` and its three overrides take `List<@Nullable Comparable>` and `CompositeCollector` keeps a `@Nullable Comparable[]`. `FlatLists.of(T, T, T)`, the six statics of `CompositeList` and `SqlBasicCall.set` take the nullable element bound of the lists they build. `LatticeSuggester` keys a node by its parent, and a root has none; `AggregateReduceFunctionsRule` names the extra columns it projects, of which the new ones have no name yet. Co-Authored-By: Claude Opus 5 --- .../calcite/materialize/LatticeSuggester.java | 2 +- .../org/apache/calcite/profile/ProfilerImpl.java | 14 +++++++------- .../rel/rules/AggregateReduceFunctionsRule.java | 2 +- .../java/org/apache/calcite/runtime/FlatLists.java | 2 +- .../java/org/apache/calcite/sql/SqlBasicCall.java | 2 +- .../org/apache/calcite/util/CompositeList.java | 14 ++++++++------ 6 files changed, 19 insertions(+), 17 deletions(-) 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 2d8fcd15af99..db07bbb85004 100644 --- a/core/src/main/java/org/apache/calcite/materialize/LatticeSuggester.java +++ b/core/src/main/java/org/apache/calcite/materialize/LatticeSuggester.java @@ -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) { 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 81448756bcaf..6a2913708da4 100644 --- a/core/src/main/java/org/apache/calcite/profile/ProfilerImpl.java +++ b/core/src/main/java/org/apache/calcite/profile/ProfilerImpl.java @@ -539,7 +539,7 @@ abstract static class Collector { this.space = space; } - abstract void add(List row); + abstract void add(List<@Nullable Comparable> row); abstract void finish(); /** Creates an initial collector of the appropriate kind. */ @@ -568,7 +568,7 @@ static class SingletonCollector extends Collector { this.sketchThreshold = sketchThreshold; } - @Override public void add(List row) { + @Override public void add(List<@Nullable Comparable> row) { final Comparable v = row.get(columnOrdinal); if (v == NullSentinel.INSTANCE) { nullCount++; @@ -597,18 +597,18 @@ static class CompositeCollector extends Collector { protected static final ImmutableBitSet OF = ImmutableBitSet.of(2, 13); final Set values = new HashSet<>(); final int[] columnOrdinals; - final Comparable[] columnValues; + final @Nullable Comparable[] columnValues; int nullCount = 0; private final int sketchThreshold; CompositeCollector(Space space, int[] columnOrdinals, int sketchThreshold) { super(space); this.columnOrdinals = columnOrdinals; - this.columnValues = new Comparable[columnOrdinals.length]; + this.columnValues = new @Nullable Comparable[columnOrdinals.length]; this.sketchThreshold = sketchThreshold; } - @Override public void add(List row) { + @Override public void add(List<@Nullable Comparable> row) { if (space.columnOrdinals.equals(OF)) { Util.discard(0); } @@ -700,7 +700,7 @@ static class HllSingletonCollector extends HllCollector { this.columnOrdinal = columnOrdinal; } - @Override public void add(List row) { + @Override public void add(List<@Nullable Comparable> row) { final Comparable value = row.get(columnOrdinal); if (value == NullSentinel.INSTANCE) { nullCount++; @@ -722,7 +722,7 @@ static class HllCompositeCollector extends HllCollector { this.columnOrdinals = columnOrdinals; } - @Override public void add(List row) { + @Override public void add(List<@Nullable Comparable> row) { if (space.columnOrdinals.equals(OF)) { Util.discard(0); } 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 c8f145acede6..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 @@ -260,7 +260,7 @@ 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.<@Nullable String>nCopies(extraArgCount, null))); } 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 69c59b8f7c24..e795f38092e3 100644 --- a/core/src/main/java/org/apache/calcite/runtime/FlatLists.java +++ b/core/src/main/java/org/apache/calcite/runtime/FlatLists.java @@ -76,7 +76,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); } 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 c98e69b2a76d..8a7c6fc9ca61 100755 --- a/core/src/main/java/org/apache/calcite/sql/SqlBasicCall.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlBasicCall.java @@ -134,7 +134,7 @@ 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); 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 From b340e2c92622196a5f57a0b6e6f0576303941991 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 17:34:43 +0300 Subject: [PATCH 34/60] [CALCITE-7736] Read each value once, and drop a castNonNull that outlived its reason `SqlToRelConverter` reads the project it has just cast rather than casting it at each use, and asks for a `DmlNamespace` after `isWrapperFor` has established there is one. `SqlValidatorImpl` collects aliases into a list that admits the null a child of the FROM clause may have, and looks up a column by an index it took from the map it is reading. `JavaRowFormat.copy` returns a list of statements and never null, so the `castNonNull` around it in `EnumUtils` goes away. `FilterProjectTransposeRule` answers `replaceIfs` with null when the input has no distribution, rather than a singleton list holding null. `replaceIfs` takes a supplier that may answer null, and does the same thing with it. `CalciteCatalogReader` falls back on a family constant, which is what `firstNonNull` is for. Co-Authored-By: Claude Opus 5 --- .../apache/calcite/adapter/enumerable/EnumUtils.java | 6 ++---- .../org/apache/calcite/plan/VisitorDataContext.java | 2 +- .../apache/calcite/prepare/CalciteCatalogReader.java | 2 +- .../calcite/rel/rules/FilterProjectTransposeRule.java | 10 ++++++++-- .../apache/calcite/sql/validate/SqlValidatorImpl.java | 4 ++-- .../org/apache/calcite/sql2rel/SqlToRelConverter.java | 9 ++++++--- 6 files changed, 20 insertions(+), 13 deletions(-) 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 2126947961b5..46327867c091 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumUtils.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumUtils.java @@ -23,7 +23,6 @@ import org.apache.calcite.linq4j.Enumerable; import org.apache.calcite.linq4j.Enumerator; import org.apache.calcite.linq4j.JoinType; -import org.apache.calcite.linq4j.Nullness; import org.apache.calcite.linq4j.Ord; import org.apache.calcite.linq4j.function.Function1; import org.apache.calcite.linq4j.function.Function2; @@ -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, 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( 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 a563218a2027..cb04e1519e4c 100644 --- a/core/src/main/java/org/apache/calcite/plan/VisitorDataContext.java +++ b/core/src/main/java/org/apache/calcite/plan/VisitorDataContext.java @@ -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/prepare/CalciteCatalogReader.java b/core/src/main/java/org/apache/calcite/prepare/CalciteCatalogReader.java index 6932692982b7..238a6acf579a 100644 --- a/core/src/main/java/org/apache/calcite/prepare/CalciteCatalogReader.java +++ b/core/src/main/java/org/apache/calcite/prepare/CalciteCatalogReader.java @@ -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 = 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/sql/validate/SqlValidatorImpl.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java index fe164cbcdf6c..1e7a13fa84d4 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 @@ -4519,7 +4519,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) { @@ -6376,7 +6376,7 @@ private void checkConstraint( RESOURCE.viewConstraintNotSatisfied(colName, Util.last(validatorTable.getQualifiedName()))); RelOptUtil.validateValueAgainstConstraint(sourceValue, - projectMap.get(colIndex), validationError); + requireNonNull(projectMap.get(colIndex), "colIndex"), validationError); } } } 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 71f431ea8a38..a31a75a63444 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java @@ -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( @@ -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(); } From 28369b67393e0df8edc473d63cb851a40176d3ab Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Mon, 24 Aug 2026 18:10:41 +0300 Subject: [PATCH 35/60] [CALCITE-7736] Close out the last of the core findings `ProfilerImpl` separates the two kinds of row it works with: a scanned row uses `NullSentinel` for a SQL null and so holds no Java null, while the sketch path builds a sparse row filled only at the ordinals of the space it feeds. `Collector.add` takes `List` so it accepts both, and each collector casts the ordinals its own space owns. Type parameters that carry the nullable bound of what they build: `RexWindowBound.accept` and its override, `Functions.ignore2`, `Util.combine`, `SqlNodeList.toArray`, `HepPlanner.onCopyHook`, `EnumerableTableModify.keyOf` and the maps keyed by it, and `ArrayTable.asList`. `SqlNode.toList` and `RelBuilder` replace a method reference and a Guava call whose wildcard comes from bytecode with a lambda and a direct iterator check. `TableFunctionScanNode` drops its raw `Enumerable` for a typed one. `ArrayTable.permute` is suppressed: an array creation keeps a non-null component type whatever it is assigned to, so writing a nullable element reports even though both arrays are declared `@Nullable Comparable[]`. Co-Authored-By: Claude Opus 5 --- .../java/org/apache/calcite/DataContexts.java | 8 +++++-- .../calcite/adapter/clone/ArrayTable.java | 10 ++++++--- .../enumerable/EnumerableTableModify.java | 8 +++---- .../calcite/config/CalciteSystemProperty.java | 3 +++ .../interpreter/AbstractSingleNode.java | 1 + .../apache/calcite/interpreter/MatchNode.java | 1 + .../interpreter/TableFunctionScanNode.java | 16 +++++++++----- .../apache/calcite/plan/hep/HepPlanner.java | 8 ++++--- .../apache/calcite/profile/ProfilerImpl.java | 22 +++++++++---------- .../apache/calcite/rex/RexWindowBound.java | 2 +- .../apache/calcite/rex/RexWindowBounds.java | 2 +- .../java/org/apache/calcite/sql/SqlNode.java | 3 ++- .../org/apache/calcite/sql/SqlNodeList.java | 2 +- .../sql/fun/SqlSpatialTypeFunctions.java | 5 +++-- .../calcite/sql2rel/SqlToRelConverter.java | 2 +- .../org/apache/calcite/tools/RelBuilder.java | 2 +- .../java/org/apache/calcite/util/Util.java | 4 ++-- .../calcite/linq4j/function/Functions.java | 3 ++- 18 files changed, 62 insertions(+), 40 deletions(-) diff --git a/core/src/main/java/org/apache/calcite/DataContexts.java b/core/src/main/java/org/apache/calcite/DataContexts.java index ada6afe8e177..a7f1e0f6337c 100644 --- a/core/src/main/java/org/apache/calcite/DataContexts.java +++ b/core/src/main/java/org/apache/calcite/DataContexts.java @@ -83,9 +83,13 @@ private static class EmptyDataContext implements DataContext, Serializable { * value for a key, remove the key from the map; the effect will be the * same. */ private static class MapDataContext extends EmptyDataContext { - private final ImmutableMap map; + private final ImmutableMap map; - MapDataContext(Map 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 08872f02747f..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 @@ -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); } @@ -284,10 +284,14 @@ public static class ObjectArray implements Representation { 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 @Nullable Comparable[size]; + final @Nullable Comparable[] comparables = + (@Nullable Comparable[]) new Comparable[size]; for (int i = 0; i < size; i++) { comparables[i] = list[sources[i]]; } 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 07eca16cb917..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 @@ -484,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; @@ -516,7 +516,7 @@ public static void applyDeleteRowsByKey(Enumerable sourceKeys, * @param rowValues row values * @return key for row */ - private static List keyOf(Object[] rowValues) { + 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/config/CalciteSystemProperty.java b/core/src/main/java/org/apache/calcite/config/CalciteSystemProperty.java index dbb82279004b..e7f47adaed28 100644 --- a/core/src/main/java/org/apache/calcite/config/CalciteSystemProperty.java +++ b/core/src/main/java/org/apache/calcite/config/CalciteSystemProperty.java @@ -618,6 +618,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/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/MatchNode.java b/core/src/main/java/org/apache/calcite/interpreter/MatchNode.java index b3cfb1f4ea18..5d94880c50bb 100644 --- a/core/src/main/java/org/apache/calcite/interpreter/MatchNode.java +++ b/core/src/main/java/org/apache/calcite/interpreter/MatchNode.java @@ -24,6 +24,7 @@ * Interpreter node that implements a * {@link Match}. */ + public class MatchNode extends AbstractSingleNode { MatchNode(Compiler compiler, Match rel) { super(compiler, rel); diff --git a/core/src/main/java/org/apache/calcite/interpreter/TableFunctionScanNode.java b/core/src/main/java/org/apache/calcite/interpreter/TableFunctionScanNode.java index 255144a4c866..295fb39bd83f 100644 --- a/core/src/main/java/org/apache/calcite/interpreter/TableFunctionScanNode.java +++ b/core/src/main/java/org/apache/calcite/interpreter/TableFunctionScanNode.java @@ -32,15 +32,18 @@ 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/plan/hep/HepPlanner.java b/core/src/main/java/org/apache/calcite/plan/hep/HepPlanner.java index df28ae14d36a..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 @@ -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/profile/ProfilerImpl.java b/core/src/main/java/org/apache/calcite/profile/ProfilerImpl.java index 6a2913708da4..dd137cbd09a4 100644 --- a/core/src/main/java/org/apache/calcite/profile/ProfilerImpl.java +++ b/core/src/main/java/org/apache/calcite/profile/ProfilerImpl.java @@ -539,7 +539,7 @@ abstract static class Collector { this.space = space; } - abstract void add(List<@Nullable Comparable> row); + abstract void add(List row); abstract void finish(); /** Creates an initial collector of the appropriate kind. */ @@ -568,8 +568,8 @@ static class SingletonCollector extends Collector { this.sketchThreshold = sketchThreshold; } - @Override public void add(List<@Nullable Comparable> 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 { @@ -597,24 +597,24 @@ static class CompositeCollector extends Collector { protected static final ImmutableBitSet OF = ImmutableBitSet.of(2, 13); final Set values = new HashSet<>(); final int[] columnOrdinals; - final @Nullable Comparable[] columnValues; + final Comparable[] columnValues; int nullCount = 0; private final int sketchThreshold; CompositeCollector(Space space, int[] columnOrdinals, int sketchThreshold) { super(space); this.columnOrdinals = columnOrdinals; - this.columnValues = new @Nullable Comparable[columnOrdinals.length]; + this.columnValues = new Comparable[columnOrdinals.length]; this.sketchThreshold = sketchThreshold; } - @Override public void add(List<@Nullable Comparable> 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++; @@ -700,8 +700,8 @@ static class HllSingletonCollector extends HllCollector { this.columnOrdinal = columnOrdinal; } - @Override public void add(List<@Nullable Comparable> 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<@Nullable Comparable> 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/rex/RexWindowBound.java b/core/src/main/java/org/apache/calcite/rex/RexWindowBound.java index 9489dc5ecde3..3b922c87b629 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexWindowBound.java +++ b/core/src/main/java/org/apache/calcite/rex/RexWindowBound.java @@ -108,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 7ae667b73666..b2e1155ccff0 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexWindowBounds.java +++ b/core/src/main/java/org/apache/calcite/rex/RexWindowBounds.java @@ -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/sql/SqlNode.java b/core/src/main/java/org/apache/calcite/sql/SqlNode.java index 270d842825c0..29b3ed6f2c7b 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlNode.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlNode.java @@ -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, (list, e) -> list.add(e), 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 8820f16fd3fa..bacd3b08ff55 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlNodeList.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlNodeList.java @@ -193,7 +193,7 @@ public static SqlNodeList of(SqlParserPos pos, List<@Nullable SqlNode> list) { } @SuppressWarnings("NullAway") - @Override public @Nullable T[] toArray(T @Nullable [] a) { + @Override public T[] toArray(T[] a) { return list.toArray(a); } 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 61c994caff98..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 @@ -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/sql2rel/SqlToRelConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java index a31a75a63444..e91ae7ecafcb 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java @@ -1045,7 +1045,7 @@ private void distinctify( if (idx >= 0) { topExprs.add(rexBuilder.makeInputRef(aggregate, idx)); } else { - topExprs.add(project.getProjects().get(i).accept(shuttle)); + topExprs.add(bottomProject.getProjects().get(i).accept(shuttle)); } } bb.setRoot( 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 8a356136796f..b9cc52065264 100644 --- a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java +++ b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java @@ -2122,7 +2122,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; } 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 7b8e533e3639..564e04cb1f5c 100644 --- a/core/src/main/java/org/apache/calcite/util/Util.java +++ b/core/src/main/java/org/apache/calcite/util/Util.java @@ -2725,14 +2725,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; 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 c042d3f494d5..a7a32fc63c6c 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 @@ -413,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; } From ddd6813a5ea721a2db5137b61f2f920c7848806e Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 17:21:40 +0300 Subject: [PATCH 36/60] [CALCITE-7736] Give the Void visitors the return type their visitor interface declares A visitor over SqlNode declares itself SqlBasicVisitor<@Nullable Void> or SqlVisitor<@Nullable Void>, so its visit methods return @Nullable Void. The overrides narrowed that to Void, which for a type whose only value is null promises nothing, and NullAway could not infer R for SqlNode.accept: the argument constrained it to be both @NonNull and @Nullable. See https://github.com/uber/NullAway/issues/1733 Co-Authored-By: Claude Opus 5 --- .../calcite/rel/rel2sql/SqlImplementor.java | 2 +- .../java/org/apache/calcite/sql/SqlPivot.java | 2 +- .../org/apache/calcite/sql/SqlUnpivot.java | 2 +- .../java/org/apache/calcite/sql/SqlUtil.java | 16 ++++++------ .../calcite/sql/fun/SqlBetweenOperator.java | 2 +- .../apache/calcite/sql/type/OperandTypes.java | 4 +-- .../calcite/sql/validate/AggChecker.java | 4 +-- .../calcite/sql/validate/AggVisitor.java | 2 +- .../sql/validate/SqlValidatorImpl.java | 26 +++++++++---------- .../apache/calcite/sql2rel/AggConverter.java | 14 +++++----- .../calcite/sql2rel/SqlToRelConverter.java | 2 +- .../java/org/apache/calcite/util/Util.java | 2 +- 12 files changed, 39 insertions(+), 39 deletions(-) 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 0d18cde092de..3d0092f51359 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 @@ -2483,7 +2483,7 @@ private boolean containsOver( } final boolean[] result = {false}; node.accept(new SqlBasicVisitor<@Nullable Void>() { - @Override public Void visit(SqlCall call) { + @Override public @Nullable Void visit(SqlCall call) { if (result[0]) { return null; } 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 89ecee5bdf3c..d22de8549de3 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlPivot.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlPivot.java @@ -176,7 +176,7 @@ static SqlNodeList toNodes(SqlNode node) { public Set usedColumnNames() { final Set columnNames = new HashSet<>(); final SqlVisitor<@Nullable Void> nameCollector = new SqlBasicVisitor<@Nullable Void>() { - @Override public Void visit(SqlIdentifier id) { + @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/SqlUnpivot.java b/core/src/main/java/org/apache/calcite/sql/SqlUnpivot.java index 89aef8c420e2..bd46e038e62a 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlUnpivot.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlUnpivot.java @@ -145,7 +145,7 @@ public void forEachNameValues( public Set usedColumnNames() { final Set columnNames = new HashSet<>(); final SqlVisitor<@Nullable Void> nameCollector = new SqlBasicVisitor<@Nullable Void>() { - @Override public Void visit(SqlIdentifier id) { + @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/SqlUtil.java b/core/src/main/java/org/apache/calcite/sql/SqlUtil.java index a2de0dfc58fe..6dcb1f20713f 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlUtil.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlUtil.java @@ -1336,7 +1336,7 @@ public static boolean containsCall(SqlNode node, try { SqlVisitor<@Nullable Void> visitor = new SqlBasicVisitor<@Nullable Void>() { - @Override public Void visit(SqlCall call) { + @Override public @Nullable Void visit(SqlCall call) { if (callPredicate.test(call)) { throw new Util.FoundOne(call); } @@ -1466,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); @@ -1478,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); @@ -1494,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/fun/SqlBetweenOperator.java b/core/src/main/java/org/apache/calcite/sql/fun/SqlBetweenOperator.java index 321b5c54d19f..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 @@ -266,7 +266,7 @@ private static SqlBetweenOperator of(boolean negated, boolean symmetric) { * Finds an AND operator in an expression. */ private static class AndFinder extends SqlBasicVisitor<@Nullable Void> { - @Override public Void visit(SqlCall call) { + @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/type/OperandTypes.java b/core/src/main/java/org/apache/calcite/sql/type/OperandTypes.java index 58754538a125..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 @@ -2057,12 +2057,12 @@ 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/validate/AggChecker.java b/core/src/main/java/org/apache/calcite/sql/validate/AggChecker.java index 6fa0e7cb872a..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 @@ -102,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; @@ -167,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/AggVisitor.java b/core/src/main/java/org/apache/calcite/sql/validate/AggVisitor.java index 6b93767d4496..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 @@ -69,7 +69,7 @@ abstract class AggVisitor extends SqlBasicVisitor<@Nullable Void> { 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/SqlValidatorImpl.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java index 1e7a13fa84d4..bb669658b194 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 @@ -1783,7 +1783,7 @@ && requireNonNull(((SqlNumericLiteral) node).bigDecimalValue()) } validateNoAggs(aggOrOverFinder, node, kind); node.accept(new SqlBasicVisitor<@Nullable Void>() { - @Override public Void visit(SqlIdentifier id) { + @Override public @Nullable Void visit(SqlIdentifier id) { if (makeNullaryCall(id) != null) { return null; } @@ -4582,7 +4582,7 @@ protected void validateSelect( private static void forEachQualified(SqlNode node, SqlValidatorScope scope, Consumer consumer) { node.accept(new SqlBasicVisitor<@Nullable Void>() { - @Override public Void visit(SqlIdentifier id) { + @Override public @Nullable Void visit(SqlIdentifier id) { final SqlQualified qualified = scope.fullyQualify(id); consumer.accept(qualified); return null; @@ -4596,7 +4596,7 @@ private static void purgeForBypassFields(SqlNode node, SqlValidatorScope scope, Set qualifieds, Set bypassQualifieds, Set remnantMustFilterFields) { node.accept(new SqlBasicVisitor<@Nullable Void>() { - @Override public Void visit(SqlIdentifier id) { + @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 @@ -6060,7 +6060,7 @@ private boolean referencesOnlyOuterColumns(SqlNode node, // ok[1] is set once at least one outer column is found. final boolean[] ok = {true, false}; node.accept(new SqlBasicVisitor<@Nullable Void>() { - @Override public Void visit(SqlIdentifier id) { + @Override public @Nullable Void visit(SqlIdentifier id) { if (!isOuterReference(currentScope, id)) { ok[0] = false; return null; @@ -6085,7 +6085,7 @@ private boolean referencesOnlyOuterColumns(SqlNode node, private static boolean containsSubQuery(SqlNode node) { final boolean[] found = {false}; node.accept(new SqlBasicVisitor<@Nullable Void>() { - @Override public Void visit(SqlCall call) { + @Override public @Nullable Void visit(SqlCall call) { if (call.getKind().belongsTo(SqlKind.QUERY)) { found[0] = true; return null; @@ -8032,36 +8032,36 @@ private static class PatternVarVisitor implements SqlVisitor<@Nullable Void> { 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); } } @@ -8944,7 +8944,7 @@ private boolean containsIdentifier(SqlNode sqlNode, SqlIdentifier target) { try { SqlVisitor<@Nullable Void> visitor = new SqlBasicVisitor<@Nullable Void>() { - @Override public Void visit(SqlIdentifier identifier) { + @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/sql2rel/AggConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/AggConverter.java index fbdec67744c1..0e6eaf2fab00 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/AggConverter.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/AggConverter.java @@ -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/SqlToRelConverter.java b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java index e91ae7ecafcb..8206502440b3 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java @@ -6759,7 +6759,7 @@ private static class AggregateFinder extends SqlBasicVisitor<@Nullable Void> { 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/util/Util.java b/core/src/main/java/org/apache/calcite/util/Util.java index 564e04cb1f5c..e12f261e6f0e 100644 --- a/core/src/main/java/org/apache/calcite/util/Util.java +++ b/core/src/main/java/org/apache/calcite/util/Util.java @@ -2900,7 +2900,7 @@ public FoundOne(@Nullable Object node) { 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; } From 77efb2ab0ece3c65b6d75a7bff78d9bd9711ad0c Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Sun, 30 Aug 2026 10:46:11 +0300 Subject: [PATCH 37/60] [CALCITE-7736] Carry the nullable element types through the JSON and metadata paths The JSON a plan serialises to is built through JsonBuilder, whose maps and lists hold null values, and the metadata that measures a row reports a null size for a column it cannot measure. Both were typed as if nothing in them could be absent, which is what the Checker Framework read out of @PolyNull and what JSpecify has to be told. Co-Authored-By: Claude Opus 5 --- .../main/java/org/apache/calcite/rel/core/Aggregate.java | 1 - core/src/main/java/org/apache/calcite/rel/core/Calc.java | 1 - .../main/java/org/apache/calcite/rel/core/Correlate.java | 1 - .../main/java/org/apache/calcite/rel/core/Filter.java | 1 - .../main/java/org/apache/calcite/rel/core/Project.java | 1 - .../main/java/org/apache/calcite/rel/core/Snapshot.java | 2 -- .../main/java/org/apache/calcite/rel/core/Uncollect.java | 1 - .../main/java/org/apache/calcite/rel/core/Values.java | 2 -- .../org/apache/calcite/rel/externalize/RelDotWriter.java | 2 +- .../java/org/apache/calcite/rel/externalize/RelJson.java | 2 +- .../apache/calcite/rel/externalize/RelJsonWriter.java | 2 +- .../apache/calcite/rel/externalize/RelWriterImpl.java | 4 ++-- .../org/apache/calcite/rel/externalize/RelXmlWriter.java | 4 ++-- .../calcite/rel/metadata/ChainedRelMetadataProvider.java | 1 - .../apache/calcite/rel/metadata/MetadataFactoryImpl.java | 2 +- .../rel/metadata/RelMdPercentageOriginalRows.java | 8 +------- .../java/org/apache/calcite/rel/metadata/RelMdSize.java | 2 +- .../org/apache/calcite/rel/mutable/MutableBiRel.java | 1 - .../org/apache/calcite/rel/mutable/MutableMultiRel.java | 1 - .../org/apache/calcite/rel/mutable/MutableSingleRel.java | 1 - .../apache/calcite/rel/rel2sql/RelToSqlConverter.java | 9 +++++---- .../org/apache/calcite/rel/rel2sql/SqlImplementor.java | 4 ---- .../org/apache/calcite/rel/rules/CalcRelSplitter.java | 1 - .../apache/calcite/rel/rules/JoinToMultiJoinRule.java | 2 +- .../java/org/apache/calcite/rel/rules/LoptJoinTree.java | 1 - .../org/apache/calcite/rel/rules/SetOpToFilterRule.java | 6 +++--- .../apache/calcite/rel/type/DynamicRecordTypeImpl.java | 1 - .../java/org/apache/calcite/rel/type/RelCrossType.java | 1 - .../apache/calcite/rel/type/RelDataTypeFactoryImpl.java | 1 - .../org/apache/calcite/rel/type/RelDataTypeField.java | 2 -- .../org/apache/calcite/rel/type/RelDataTypeImpl.java | 1 - 31 files changed, 19 insertions(+), 50 deletions(-) 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 f23c6128c489..e0759ba8401e 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 @@ -150,7 +150,6 @@ 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("NullAway") protected Aggregate( RelOptCluster cluster, RelTraitSet traitSet, 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 6610c14e500c..7418207b0d88 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 @@ -68,7 +68,6 @@ public abstract class Calc extends SingleRel implements Hintable { * @param child Input relation * @param program Calc program */ - @SuppressWarnings("NullAway") protected Calc( RelOptCluster cluster, RelTraitSet traits, 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 06736eee2d12..286eb316fe45 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 @@ -91,7 +91,6 @@ public abstract class Correlate extends BiRel implements Hintable { * @param requiredColumns Set of columns that are used by correlation * @param joinType Join type */ - @SuppressWarnings("NullAway") protected Correlate( RelOptCluster cluster, RelTraitSet traitSet, 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 b9440033dd13..335764131b16 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 @@ -77,7 +77,6 @@ public abstract class Filter extends SingleRel implements Hintable { * @param condition boolean expression which determines whether a row is * allowed to pass */ - @SuppressWarnings("NullAway") protected Filter( RelOptCluster cluster, RelTraitSet traits, 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 567f07359f5e..6012185cb265 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 @@ -88,7 +88,6 @@ public abstract class Project extends SingleRel implements Hintable { * @param variableSet Correlation variables set by this relational expression * to be used by nested expressions */ - @SuppressWarnings("NullAway") protected Project( RelOptCluster cluster, RelTraitSet traits, 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 962b05a570d7..93473f025fde 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 @@ -80,7 +80,6 @@ public Snapshot(RelInput input) { * @param period Timestamp expression which as the table was at the given * time in the past */ - @SuppressWarnings("NullAway") protected Snapshot(RelOptCluster cluster, RelTraitSet traitSet, List hints, RelNode input, RexNode period) { super(cluster, traitSet, input); @@ -98,7 +97,6 @@ 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("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/Uncollect.java b/core/src/main/java/org/apache/calcite/rel/core/Uncollect.java index 69125d76b16a..00c88648901a 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,6 @@ 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("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 bbceb03d6ed3..178ed7a8300c 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 @@ -84,7 +84,6 @@ 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("NullAway") protected Values( RelOptCluster cluster, List hints, @@ -111,7 +110,6 @@ protected Values( * list contains tuples; each inner list is one tuple; all * tuples must be of same length, conforming to rowType */ - @SuppressWarnings("NullAway") protected Values( RelOptCluster cluster, RelDataType rowType, 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 bf0ef3c4a5cf..39b4ce52842e 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 @@ -105,7 +105,7 @@ protected String getRelNodeLabel( sb.setLength(0); if (detailLevel != SqlExplainLevel.NO_ATTRIBUTES) { - for (Pair value : values) { + for (Pair value : values) { if (value.right instanceof RelNode) { continue; } 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 c1bdff426b5e..0b8f64e47d7b 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 @@ -840,7 +840,7 @@ public RexNode toRex(RelOptCluster cluster, Object o) { final Map map = (Map) o; final RelDataTypeFactory typeFactory = cluster.getTypeFactory(); if (map.containsKey("op")) { - final Map opMap = get(map, "op"); + final Map opMap = get(map, "op"); if (map.containsKey("class")) { opMap.put("class", get(map, "class")); } 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 26f1db978973..fe531ebbcd95 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 @@ -78,7 +78,7 @@ protected void explain_(RelNode rel, List> values map.put("id", null); // ensure that id is the first attribute map.put("relOp", relJson.classToTypeName(rel.getClass())); - for (Pair value : values) { + for (Pair value : values) { if (value.right instanceof RelNode) { continue; } 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 f8cd466292b7..8489c3f44e42 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 @@ -87,7 +87,7 @@ protected void explain_(RelNode rel, s.append(rel.getRelTypeName()); if (detailLevel != SqlExplainLevel.NO_ATTRIBUTES) { int j = 0; - for (Pair value : values) { + for (Pair value : values) { if (value.right instanceof RelNode) { continue; } @@ -186,7 +186,7 @@ private boolean checkInputsPresentInExplain(RelNode node) { */ public String simple() { final StringBuilder buf = new StringBuilder("("); - for (Ord> ord : Ord.zip(values)) { + for (Ord> ord : Ord.zip(values)) { if (ord.i > 0) { buf.append(", "); } 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 fef5fbf0eaa5..59abe61def48 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 @@ -99,7 +99,7 @@ private void explainGeneric( xmlOutput.endBeginTag("RelNode"); final List inputs = new ArrayList<>(); - for (Pair pair : values) { + for (Pair pair : values) { if (pair.right instanceof RelNode) { inputs.add((RelNode) pair.right); continue; @@ -144,7 +144,7 @@ private void explainSpecific( xmlOutput.beginBeginTag(tagName); xmlOutput.attribute("id", rel.getId() + ""); - for (Pair value : values) { + for (Pair value : values) { if (value.right instanceof RelNode) { continue; } 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 87e4b110a4c6..3a0dd581551b 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 @@ -51,7 +51,6 @@ public class ChainedRelMetadataProvider implements RelMetadataProvider { /** * Creates a chain. */ - @SuppressWarnings("NullAway") protected ChainedRelMetadataProvider( ImmutableList providers) { this.providers = providers; 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 e74d71f9e438..782b2a02aa9d 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 @@ -59,7 +59,7 @@ public MetadataFactoryImpl(RelMetadataProvider provider) { //noinspection RedundantTypeArguments return CacheLoader., Class>, UnboundMetadata<@Nullable Metadata>>from(key -> { - final UnboundMetadata<@Nullable Metadata> function = + final UnboundMetadata function = provider.apply(key.left, key.right); // Return DUMMY, not null, so the cache knows to not ask again. return function != null ? function : DUMMY; 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 d76bf8daa20d..43e1aff64a9d 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 @@ -239,13 +239,7 @@ public Double getPercentageOriginalRows(Union rel, RelMetadataQuery mq) { 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) { + if (numerator == null || denominator == null) { return null; } 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 33a540ba736c..33aa80213f8d 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 @@ -97,7 +97,7 @@ protected RelMdSize() {} } double d = 0d; final List fields = rel.getRowType().getFieldList(); - for (Pair<@Nullable Double, RelDataTypeField> p + for (Pair p : Pair.zip(averageColumnSizes, fields)) { if (p.left == null) { Double fieldValueSize = averageFieldValueSize(p.right); 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 b807ff8430fd..e7475226cc25 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,6 @@ abstract class MutableBiRel extends MutableRel { protected MutableRel left; protected MutableRel right; - @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/MutableMultiRel.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableMultiRel.java index 2d366c26f838..417b21b6b9b5 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,6 @@ abstract class MutableMultiRel extends MutableRel { protected final List inputs; - @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/MutableSingleRel.java b/core/src/main/java/org/apache/calcite/rel/mutable/MutableSingleRel.java index 5cb19c95b6f2..3b7e4788c649 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,6 @@ abstract class MutableSingleRel extends MutableRel { protected MutableRel input; - @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/rel2sql/RelToSqlConverter.java b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java index af1e03a4e1a3..55203d061aea 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 @@ -1439,10 +1439,11 @@ private static SqlIdentifier getSqlTargetTable(RelNode e) { // Use the foreign catalog, schema and table names, if they exist, // rather than the qualified name of the shadow table in Calcite. final RelOptTable table = requireNonNull(e.getTable()); - return table.maybeUnwrap(JdbcTable.class) - .map(JdbcTable::tableName) - .orElseGet(() -> - new SqlIdentifier(table.getQualifiedName(), SqlParserPos.ZERO)); + return requireNonNull( + table.maybeUnwrap(JdbcTable.class) + .map(JdbcTable::tableName) + .orElseGet(() -> + new SqlIdentifier(table.getQualifiedName(), SqlParserPos.ZERO))); } /** Visits a TableModify; called by {@link #dispatch} via reflection. */ 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 3d0092f51359..a08ed9d9e7d8 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 @@ -810,10 +810,6 @@ public SqlNode toSql(@Nullable RexProgram program, RexNode rex) { String pv = ref.getAlpha(); SqlNode refNode = field(ref.getIndex()); final SqlIdentifier id = (SqlIdentifier) refNode; - if ("*".equals(pv)) { - // The universal variable "*" is not a valid qualifier; emit the plain column reference. - return refNode; - } if (id.names.size() > 1) { return id.setName(0, pv); } else { 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 cfd843e0c530..32eac1cebe35 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 @@ -1051,7 +1051,6 @@ private static class HighestUsageFinder extends RexVisitorImpl<@Nullable Void> { continue; } currentLevel = exprLevels[i]; - @SuppressWarnings("NullAway") final Void unused = exprs[i].accept(this); } } 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 826a924207d9..d8710f17f257 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 @@ -363,7 +363,7 @@ private static void copyOuterJoinInfo( requireNonNull(destFields, "destFields"); int[] adjustments = new int[srcFields.size()]; Arrays.fill(adjustments, adjustmentAmount); - for (Pair src : srcJoinSpecs) { + for (Pair src : srcJoinSpecs) { destJoinSpecs.add( Pair.of( src.left, 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 7229f534a857..8c3e8053a754 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 @@ -49,7 +49,6 @@ public class LoptJoinTree { * @param joinTree RelNode corresponding to the single node * @param factorId factor id of the node */ - @SuppressWarnings("NullAway") public LoptJoinTree(RelNode joinTree, int factorId) { this.joinTree = joinTree; this.factorTree = new Leaf(factorId, this); 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 7f4ca4e25165..b37f014ab786 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 @@ -154,10 +154,10 @@ private static void match(RelOptRuleCall call) { } int branchCount = 0; - for (Map.Entry, List<@Nullable RexNode>> entry + for (Map.Entry, List> entry : sourceToConds.entrySet()) { - Pair left = entry.getKey(); - List<@Nullable RexNode> conds = entry.getValue(); + Pair left = entry.getKey(); + List conds = entry.getValue(); // Single null condition indicates pass-through branch, // directly add its corresponding input to the new inputs list. if (conds.size() == 1 && conds.get(0) == null) { 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 2d35b8021618..57657c3cdb15 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 @@ -39,7 +39,6 @@ public class DynamicRecordTypeImpl extends DynamicRecordType { private final RelDataTypeHolder holder; /** Creates a DynamicRecordTypeImpl. */ - @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 f6b3cb67fefa..889076e2007e 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,6 @@ public class RelCrossType extends RelDataTypeImpl { * Creates a cartesian product type. This should only be called from a * factory method. */ - @SuppressWarnings("NullAway") public RelCrossType( List types, List fields) { 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 4b873b1ecaaf..971fc15f503a 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 @@ -656,7 +656,6 @@ public JavaType( this(clazz, nullable, null, null); } - @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 9683769786ad..7fceec70d5d0 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,6 @@ public interface RelDataTypeField extends Map.Entry { * @deprecated Use {@code RelDataTypeField::getIndex} */ @Deprecated // to be removed before 2.0 - @SuppressWarnings("NullAway") class ToFieldIndex implements com.google.common.base.Function { @Override public Integer apply(RelDataTypeField o) { @@ -51,7 +50,6 @@ class ToFieldIndex * @deprecated Use {@code RelDataTypeField::getName} */ @Deprecated // to be removed before 2.0 - @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/RelDataTypeImpl.java b/core/src/main/java/org/apache/calcite/rel/type/RelDataTypeImpl.java index 52ef5f4d55d2..2b1ba24aad31 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 @@ -352,7 +352,6 @@ protected abstract void generateTypeString( * This should be called in every non-abstract subclass * constructor once the type is fully defined. */ - @SuppressWarnings("NullAway") protected void computeDigest() { digest = null; innerDigest = new InnerRelDataTypeDigest(); From 0b1844811eb82cc11e7c6dffb5d03cb6d4209f74 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Sun, 30 Aug 2026 10:46:12 +0300 Subject: [PATCH 38/60] [CALCITE-7736] Carry the nullable element types through the adapters and the runtime An enumerable row holds nulls, a cloned column holds whatever the table stored, and the SQL runtime builds maps and arrays whose entries are absent wherever the query says they are. The containers now say so, and the casts that stood in for saying it are gone. Co-Authored-By: Claude Opus 5 --- .../calcite/adapter/enumerable/EnumUtils.java | 2 +- .../enumerable/EnumerableHashJoin.java | 2 +- .../enumerable/EnumerableMergeUnion.java | 2 +- .../enumerable/EnumerableRelImplementor.java | 1 - .../enumerable/NestedBlockBuilderImpl.java | 1 - .../enumerable/RexToLixTranslator.java | 4 +- .../calcite/adapter/jdbc/JdbcTable.java | 1 - .../config/CalciteConnectionConfigImpl.java | 1 - .../calcite/interpreter/AggregateNode.java | 1 - .../calcite/interpreter/Interpreter.java | 1 - .../calcite/jdbc/CachingCalciteSchema.java | 1 - .../calcite/jdbc/CalciteConnectionImpl.java | 2 +- .../apache/calcite/jdbc/CalciteMetaImpl.java | 2 +- .../apache/calcite/materialize/Lattice.java | 2 +- .../calcite/materialize/LatticeNode.java | 1 - .../calcite/materialize/LatticeRootNode.java | 1 - .../calcite/materialize/LatticeSpace.java | 1 - .../calcite/materialize/MutableNode.java | 1 - .../org/apache/calcite/materialize/Step.java | 1 - .../calcite/prepare/CalcitePrepareImpl.java | 2 +- .../apache/calcite/prepare/PlannerImpl.java | 1 - .../calcite/runtime/AutomatonBuilder.java | 2 - .../calcite/runtime/CalciteException.java | 1 - .../org/apache/calcite/runtime/ConsList.java | 8 ++-- .../runtime/DeterministicAutomaton.java | 1 - .../org/apache/calcite/runtime/FlatLists.java | 45 ++++++++++--------- .../org/apache/calcite/runtime/Resources.java | 1 - .../calcite/runtime/SpaceFillingCurve2D.java | 1 - .../apache/calcite/runtime/SqlFunctions.java | 5 ++- .../apache/calcite/runtime/XmlFunctions.java | 2 +- .../statistic/MapSqlStatisticProvider.java | 3 +- 31 files changed, 42 insertions(+), 58 deletions(-) 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 46327867c091..ef9213a3253b 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 @@ -1221,7 +1221,7 @@ private void initialize() { } // A key column index of -1 means that there is no key; every element // then maps to the same (null) key, forming one session timeline. - Object key = indexOfKeyColumn < 0 ? null : element[indexOfKeyColumn]; + @Nullable Object key = indexOfKeyColumn < 0 ? null : element[indexOfKeyColumn]; Object watermark = requireNonNull(element[indexOfWatermarkedColumn], "element[indexOfWatermarkedColumn]"); 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 7a169aaf0b2c..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 @@ -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/EnumerableMergeUnion.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableMergeUnion.java index c945ac2a0bc5..09d5a9e221e8 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.firstNonNull(physType.comparer(), + Util.first(physType.comparer(), Expressions.call(BuiltInMethod.IDENTITY_COMPARER.method)); final Expression unionExp = 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 3c764b42b5ef..13e41e1a8655 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableRelImplementor.java @@ -89,7 +89,6 @@ public class EnumerableRelImplementor extends JavaRelImplementor { private final Map, ParameterExpression> stashedParameters = new LinkedHashMap<>(); - @SuppressWarnings("NullAway") protected final Function1 allCorrelateVariables = this::getCorrelVariableGetter; 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 d5cdbecc594e..def812bda6b5 100644 --- a/core/src/main/java/org/apache/calcite/adapter/enumerable/NestedBlockBuilderImpl.java +++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/NestedBlockBuilderImpl.java @@ -34,7 +34,6 @@ public class NestedBlockBuilderImpl implements NestedBlockBuilder { * * @param block root code block */ - @SuppressWarnings("NullAway") public NestedBlockBuilderImpl(BlockBuilder block) { nestBlock(block); } 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 c10a2d3f2fe1..81b92ea42ea2 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 @@ -1246,7 +1246,7 @@ public List translateList( RexImpTable.NullAs nullAs, List storageTypes) { final List list = new ArrayList<>(); - for (Pair e : Pair.zip(operandList, storageTypes)) { + for (Pair e : Pair.zip(operandList, storageTypes)) { list.add(translate(e.left, nullAs, e.right)); } return list; @@ -1351,7 +1351,7 @@ public static Expression translateCondition(RexProgram program, */ public static Expression translateCondition(RexProgram program, JavaTypeFactory typeFactory, BlockBuilder list, InputGetter inputGetter, - Function1 correlates, SqlConformance conformance, + @Nullable Function1 correlates, SqlConformance conformance, boolean nullable, RexImplementorTable implementorTable) { RexLocalRef condition = program.getCondition(); if (condition == null) { diff --git a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcTable.java b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcTable.java index 13fffac750c0..407dcd6c035f 100644 --- a/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcTable.java +++ b/core/src/main/java/org/apache/calcite/adapter/jdbc/JdbcTable.java @@ -78,7 +78,6 @@ */ public class JdbcTable extends AbstractQueryableTable implements TranslatableTable, ScannableTable, ModifiableTable { - @SuppressWarnings("NullAway") private final Supplier protoRowTypeSupplier = Suppliers.memoize(this::supplyProto); public final JdbcSchema jdbcSchema; 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 baf46bce2da2..bb72ccab7750 100644 --- a/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfigImpl.java +++ b/core/src/main/java/org/apache/calcite/config/CalciteConnectionConfigImpl.java @@ -109,7 +109,6 @@ public boolean isSet(CalciteConnectionProperty property) { @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 = 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 a856d93e97d2..82e74c3d272e 100644 --- a/core/src/main/java/org/apache/calcite/interpreter/AggregateNode.java +++ b/core/src/main/java/org/apache/calcite/interpreter/AggregateNode.java @@ -93,7 +93,6 @@ public AggregateNode(Compiler compiler, Aggregate rel) { ImmutableList.Builder builder = ImmutableList.builder(); for (AggregateCall aggregateCall : rel.getAggCallList()) { - @SuppressWarnings("NullAway") AccumulatorFactory accumulator = getAccumulator(compiler, aggregateCall, false); builder.add(accumulator); 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 19de7be6e940..e6203ab31a83 100644 --- a/core/src/main/java/org/apache/calcite/interpreter/Interpreter.java +++ b/core/src/main/java/org/apache/calcite/interpreter/Interpreter.java @@ -82,7 +82,6 @@ public Interpreter(DataContext dataContext, RelNode rootRel) { final RelNode rel = optimize(rootRel); final CompilerImpl compiler = new Nodes.CoreCompiler(this, rootRel.getCluster()); - @SuppressWarnings("NullAway") Pair> pair = compiler.visitRoot(rel); this.rootRel = pair.left; this.nodes = ImmutableMap.copyOf(pair.right); 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 a53051d66a6e..277ccd343664 100644 --- a/core/src/main/java/org/apache/calcite/jdbc/CachingCalciteSchema.java +++ b/core/src/main/java/org/apache/calcite/jdbc/CachingCalciteSchema.java @@ -57,7 +57,6 @@ class CachingCalciteSchema extends CalciteSchema { this(parent, schema, name, null, null, null, null, null, null, null, null); } - @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/CalciteConnectionImpl.java b/core/src/main/java/org/apache/calcite/jdbc/CalciteConnectionImpl.java index 244e6b1adb03..147f0de099b1 100644 --- a/core/src/main/java/org/apache/calcite/jdbc/CalciteConnectionImpl.java +++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteConnectionImpl.java @@ -363,7 +363,7 @@ static class CalciteQueryable extends BaseQueryable { } public CalciteConnection getConnection() { - return (CalciteConnection) provider; + return (CalciteConnection) requireNonNull(provider, "provider"); } } 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 0c4d0df1c198..5b847dea34c6 100644 --- a/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java +++ b/core/src/main/java/org/apache/calcite/jdbc/CalciteMetaImpl.java @@ -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/materialize/Lattice.java b/core/src/main/java/org/apache/calcite/materialize/Lattice.java index 98fc645e405f..0ac75021eff6 100644 --- a/core/src/main/java/org/apache/calcite/materialize/Lattice.java +++ b/core/src/main/java/org/apache/calcite/materialize/Lattice.java @@ -851,7 +851,7 @@ public Builder(LatticeSpace space, CalciteSchema schema, String sql) { final DirectedGraph graph = DefaultDirectedGraph.create(Edge.FACTORY); final List vertices = new ArrayList<>(); - for (Pair p : Pair.zip(relNodes, aliases)) { + for (Pair p : Pair.zip(relNodes, aliases)) { final LatticeTable table = space.register(p.left.getTable()); final Vertex vertex = new Vertex(table, p.right); graph.addVertex(vertex); 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 b47d33856aa2..3a7dd2ee4ffd 100644 --- a/core/src/main/java/org/apache/calcite/materialize/LatticeNode.java +++ b/core/src/main/java/org/apache/calcite/materialize/LatticeNode.java @@ -76,7 +76,6 @@ public abstract class LatticeNode { if (i++ > 0) { sb.append(' '); } - @SuppressWarnings("NullAway") final LatticeChildNode node = new LatticeChildNode(space, this, mutableChild); sb.append(node.digest); 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 f9dc05ff783a..607b882de7bb 100644 --- a/core/src/main/java/org/apache/calcite/materialize/LatticeRootNode.java +++ b/core/src/main/java/org/apache/calcite/materialize/LatticeRootNode.java @@ -29,7 +29,6 @@ public class LatticeRootNode extends LatticeNode { public final ImmutableList descendants; final ImmutableList paths; - @SuppressWarnings("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 138e769af27b..4a1b601e530e 100644 --- a/core/src/main/java/org/apache/calcite/materialize/LatticeSpace.java +++ b/core/src/main/java/org/apache/calcite/materialize/LatticeSpace.java @@ -39,7 +39,6 @@ class LatticeSpace { final SqlStatisticProvider statisticProvider; private final Map, LatticeTable> tableMap = new HashMap<>(); - @SuppressWarnings("NullAway") final AttributedDirectedGraph g = new AttributedDirectedGraph<>(new Step.Factory(this)); private final Map, String> simpleTableNames = new HashMap<>(); 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 ff91779e6beb..52f5fc31765f 100644 --- a/core/src/main/java/org/apache/calcite/materialize/MutableNode.java +++ b/core/src/main/java/org/apache/calcite/materialize/MutableNode.java @@ -69,7 +69,6 @@ class MutableNode { } /** Creates a non-root node. */ - @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/Step.java b/core/src/main/java/org/apache/calcite/materialize/Step.java index fcbab3477e88..9c4785896c5f 100644 --- a/core/src/main/java/org/apache/calcite/materialize/Step.java +++ b/core/src/main/java/org/apache/calcite/materialize/Step.java @@ -145,7 +145,6 @@ static class Factory implements AttributedDirectedGraph.AttributedEdgeFactory< LatticeTable, Step> { private final LatticeSpace space; - @SuppressWarnings("NullAway") Factory(LatticeSpace space) { this.space = requireNonNull(space, "space"); } 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 f44178c8a6c8..b93785cbc574 100644 --- a/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java +++ b/core/src/main/java/org/apache/calcite/prepare/CalcitePrepareImpl.java @@ -569,7 +569,7 @@ private static CalciteSignature simplePrepare(Context context, String sql .build(); @SuppressWarnings("unchecked") final List list = (List) ImmutableList.of(1); - final List origin = null; + final @Nullable List origin = null; final List<@Nullable List> origins = Collections.nCopies(x.getFieldCount(), origin); final List columns = 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 38b233da1ccf..7b43fe6d5d79 100644 --- a/core/src/main/java/org/apache/calcite/prepare/PlannerImpl.java +++ b/core/src/main/java/org/apache/calcite/prepare/PlannerImpl.java @@ -104,7 +104,6 @@ public class PlannerImpl implements Planner, ViewExpander { /** Creates a planner. Not a public API; call * {@link org.apache.calcite.tools.Frameworks#getPlanner} instead. */ - @SuppressWarnings("NullAway") public PlannerImpl(FrameworkConfig config) { this.costFactory = config.getCostFactory(); this.defaultSchema = config.getDefaultSchema(); 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 049c230c375f..7267a5ee3a90 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,7 @@ public class AutomatonBuilder { private final Map symbolIds = new HashMap<>(); private final List stateList = new ArrayList<>(); private final List transitionList = new ArrayList<>(); - @SuppressWarnings("NullAway") private final State startState = createState(); - @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/CalciteException.java b/core/src/main/java/org/apache/calcite/runtime/CalciteException.java index ad2132abe9a7..8db74eb31005 100644 --- a/core/src/main/java/org/apache/calcite/runtime/CalciteException.java +++ b/core/src/main/java/org/apache/calcite/runtime/CalciteException.java @@ -53,7 +53,6 @@ public class CalciteException extends RuntimeException { * @param message error message * @param cause underlying cause */ - @SuppressWarnings("NullAway") public CalciteException( String message, @Nullable Throwable cause) { 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 856a1b20e956..7927f9923cd4 100644 --- a/core/src/main/java/org/apache/calcite/runtime/ConsList.java +++ b/core/src/main/java/org/apache/calcite/runtime/ConsList.java @@ -114,13 +114,13 @@ private ConsList(E first, List rest) { return toList().listIterator(index); } - @Override public @Nullable Object[] toArray(ConsList<@Nullable E> this) { + @Override public @Nullable Object[] toArray() { return 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); @@ -130,7 +130,7 @@ private ConsList(E first, List rest) { //noinspection unchecked a[i++] = (T) c.first; if (!(c.rest instanceof ConsList)) { - Object[] a2 = c.rest.toArray(); + @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 67acd8bd7118..3e480382f6b0 100644 --- a/core/src/main/java/org/apache/calcite/runtime/DeterministicAutomaton.java +++ b/core/src/main/java/org/apache/calcite/runtime/DeterministicAutomaton.java @@ -42,7 +42,6 @@ public class DeterministicAutomaton { private final ImmutableList transitions; /** Constructs the DFA from an epsilon-NFA. */ - @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/FlatLists.java b/core/src/main/java/org/apache/calcite/runtime/FlatLists.java index e795f38092e3..0353a321924d 100644 --- a/core/src/main/java/org/apache/calcite/runtime/FlatLists.java +++ b/core/src/main/java/org/apache/calcite/runtime/FlatLists.java @@ -21,7 +21,6 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; import java.util.AbstractList; @@ -34,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. @@ -257,7 +256,9 @@ 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()))); } } @@ -397,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()); } @@ -406,7 +407,7 @@ protected static class Flat1List return a; } - @Override public @Nullable Object[] toArray(Flat1List<@Nullable T> this) { + @Override public Object[] toArray() { return new Object[] {t0}; } @@ -529,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()); } @@ -539,7 +540,7 @@ protected static class Flat2List return a; } - @Override public @Nullable Object[] toArray(Flat2List<@Nullable T> this) { + @Override public Object[] toArray() { return new Object[] {t0, t1}; } @@ -678,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()); } @@ -689,7 +690,7 @@ protected static class Flat3List return a; } - @Override public @Nullable Object[] toArray(Flat3List<@Nullable T> this) { + @Override public Object[] toArray() { return new Object[] {t0, t1, t2}; } @@ -846,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()); } @@ -858,7 +859,7 @@ protected static class Flat4List return a; } - @Override public @Nullable Object[] toArray(Flat4List<@Nullable T> this) { + @Override public Object[] toArray() { return new Object[] {t0, t1, t2, t3}; } @@ -1034,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()); } @@ -1047,7 +1048,7 @@ protected static class Flat5List return a; } - @Override public @Nullable Object[] toArray(Flat5List<@Nullable T> this) { + @Override public Object[] toArray() { return new Object[] {t0, t1, t2, t3, t4}; } @@ -1242,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()); } @@ -1256,7 +1257,7 @@ protected static class Flat6List return a; } - @Override public @Nullable Object[] toArray(Flat6List<@Nullable T> this) { + @Override public Object[] toArray() { return new Object[] {t0, t1, t2, t3, t4, t5}; } @@ -1336,7 +1337,7 @@ protected ComparableListImpl(List list) { return list.size(); } - @Override @NonNull public Object[] toArray(@NonNull ComparableListImpl this) { + @Override public @Nullable Object[] toArray() { return this.list.toArray(); } 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 5770b5ee11b6..b8fd1374098b 100644 --- a/core/src/main/java/org/apache/calcite/runtime/Resources.java +++ b/core/src/main/java/org/apache/calcite/runtime/Resources.java @@ -285,7 +285,6 @@ public static class Element { protected final Method method; protected final String key; - @SuppressWarnings("NullAway") public Element(Method method) { this.method = method; this.key = deriveKey(); 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 3330307a7016..bde003d82017 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,6 @@ class OverlappingRange extends AbstractRange { /** Lexicographic ordering for {@link IndexRange}. */ class IndexRangeOrdering extends Ordering { - @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/SqlFunctions.java b/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java index 10c3843321ad..5356574e0b9f 100644 --- a/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java +++ b/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java @@ -273,6 +273,9 @@ private static class ArrayCartesianProductEnumerable } @Override public Enumerator<@Nullable Object[]> enumerator() { + // 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()); } } @@ -8263,8 +8266,6 @@ private static class ProductComparableListEnumerator @Override public FlatLists.ComparableList current() { int i = 0; for (Object element : (Object[]) elements) { - // 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; 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 c3682b58245c..c7acf5c5d791 100644 --- a/core/src/main/java/org/apache/calcite/runtime/XmlFunctions.java +++ b/core/src/main/java/org/apache/calcite/runtime/XmlFunctions.java @@ -182,7 +182,7 @@ private XmlFunctions() { final Node documentNode = getDocumentNode(xml); try { - List result = new ArrayList<>(); + List<@Nullable String> result = new ArrayList<>(); NodeList nodes = (NodeList) xpathExpression .evaluate(documentNode, XPathConstants.NODESET); for (int i = 0; i < nodes.getLength(); i++) { diff --git a/core/src/main/java/org/apache/calcite/statistic/MapSqlStatisticProvider.java b/core/src/main/java/org/apache/calcite/statistic/MapSqlStatisticProvider.java index 1c4e85c82992..41bfa75aa78d 100644 --- a/core/src/main/java/org/apache/calcite/statistic/MapSqlStatisticProvider.java +++ b/core/src/main/java/org/apache/calcite/statistic/MapSqlStatisticProvider.java @@ -105,7 +105,8 @@ public enum MapSqlStatisticProvider implements SqlStatisticProvider { .map(value -> Arrays.asList(value.jdbcSchemaName, value.jdbcTableName)) .orElseGet(table::getQualifiedName); - return requireNonNull(cardinalityMap.get(qualifiedName.toString())); + return requireNonNull( + cardinalityMap.get(requireNonNull(qualifiedName, "qualifiedName").toString())); } @Override public boolean isForeignKey(RelOptTable fromTable, List fromColumns, From d6e8a550f382e9a9923784552bfdc00f1d6be667 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Sun, 30 Aug 2026 10:46:15 +0300 Subject: [PATCH 39/60] [CALCITE-7736] Carry the nullable element types through the planner and the parser A field alias the parser could not infer, a filter a rule did not produce, a storage type an expression does not pin down: each is a null that the collection around it has always held. Typing them lets the visitors, the validator and the builder drop the suppressions that hid the mismatch. Co-Authored-By: Claude Opus 5 --- .../java/org/apache/calcite/DataContexts.java | 8 +-- .../calcite/plan/AbstractRelOptPlanner.java | 7 +- .../calcite/plan/RelOptRuleOperand.java | 1 - .../calcite/plan/SubstitutionVisitor.java | 22 +----- .../apache/calcite/plan/TableAccessMap.java | 1 - .../calcite/plan/VisitorDataContext.java | 2 +- .../apache/calcite/plan/hep/HepPlanner.java | 2 +- .../calcite/plan/volcano/RelSubset.java | 1 - .../calcite/plan/volcano/VolcanoPlanner.java | 1 - .../plan/volcano/VolcanoRuleMatch.java | 1 - .../org/apache/calcite/rex/RexBuilder.java | 1 - .../org/apache/calcite/rex/RexExecutable.java | 2 +- .../org/apache/calcite/rex/RexWindow.java | 1 - .../apache/calcite/rex/RexWindowBound.java | 2 - .../calcite/server/DdlExecutorImpl.java | 1 - .../org/apache/calcite/sql/SqlDialect.java | 1 - .../calcite/sql/SqlJdbcFunctionCall.java | 1 - .../org/apache/calcite/sql/SqlNodeList.java | 12 ---- .../org/apache/calcite/sql/SqlSetOption.java | 2 +- .../java/org/apache/calcite/sql/SqlUtil.java | 4 +- .../org/apache/calcite/sql/SqlWindow.java | 1 - .../calcite/sql/fun/SqlInternalOperators.java | 9 ++- .../fun/SqlLibraryOperatorTableFactory.java | 1 - .../sql/parser/SqlAbstractParserImpl.java | 1 - .../calcite/sql/parser/SqlParserUtil.java | 2 +- .../calcite/sql/pretty/SqlPrettyWriter.java | 1 - .../apache/calcite/sql/type/SqlTypeUtil.java | 2 - .../calcite/sql/validate/DelegatingScope.java | 1 - .../sql/validate/SqlUserDefinedFunction.java | 8 +-- .../sql/validate/SqlValidatorException.java | 1 - .../sql/validate/SqlValidatorImpl.java | 2 +- .../sql2rel/ReflectiveConvertletTable.java | 2 - .../calcite/sql2rel/RelFieldTrimmer.java | 1 - .../calcite/sql2rel/SqlToRelConverter.java | 11 --- .../sql2rel/TopDownGeneralDecorrelator.java | 1 - .../org/apache/calcite/tools/RelBuilder.java | 9 +-- .../org/apache/calcite/util/BlackholeMap.java | 2 - .../org/apache/calcite/util/CompositeMap.java | 3 - .../org/apache/calcite/util/DateString.java | 1 - .../apache/calcite/util/ImmutableIntList.java | 1 - .../org/apache/calcite/util/JsonBuilder.java | 2 +- .../org/apache/calcite/util/NumberUtil.java | 8 +-- .../calcite/util/PartiallyOrderedSet.java | 1 - .../org/apache/calcite/util/Permutation.java | 1 - .../java/org/apache/calcite/util/Sarg.java | 1 - .../calcite/util/SimpleNamespaceContext.java | 1 - .../org/apache/calcite/util/TimeString.java | 1 - .../java/org/apache/calcite/util/Util.java | 18 ++++- .../util/graph/DefaultDirectedGraph.java | 1 - .../util/mapping/AbstractSourceMapping.java | 1 - .../util/mapping/AbstractTargetMapping.java | 1 - .../apache/calcite/util/mapping/Mappings.java | 1 - .../apache/calcite/plan/RelWriterTest.java | 2 +- .../rel/logical/ToLogicalConverterTest.java | 3 +- .../rel/rel2sql/RelToSqlConverterTest.java | 4 +- .../CorrelateProjectExtractorTest.java | 9 ++- .../calcite/sql2rel/RelDecorrelatorTest.java | 3 +- .../calcite/sql2rel/RelFieldTrimmerTest.java | 11 ++- .../apache/calcite/test/InterpreterTest.java | 2 +- .../org/apache/calcite/test/LintTest.java | 68 ------------------- .../apache/calcite/test/RelBuilderTest.java | 19 +++--- .../apache/calcite/test/RelMetadataTest.java | 4 +- .../apache/calcite/test/RelOptRulesTest.java | 2 +- .../org/apache/calcite/util/UtilTest.java | 10 ++- core/src/test/resources/sql/match.iq | 35 ---------- .../calcite/linq4j/AbstractEnumerable.java | 5 +- .../apache/calcite/linq4j/BaseQueryable.java | 12 ++-- .../calcite/linq4j/DefaultEnumerable.java | 3 +- .../calcite/linq4j/EnumerableDefaults.java | 2 + .../calcite/linq4j/ExtendedEnumerable.java | 2 +- .../linq4j/ExtendedOrderedEnumerable.java | 5 +- .../org/apache/calcite/linq4j/Linq4j.java | 1 + .../calcite/linq4j/OrderedEnumerable.java | 4 +- .../apache/calcite/linq4j/RawEnumerable.java | 4 +- .../calcite/linq4j/function/Functions.java | 1 + 75 files changed, 108 insertions(+), 273 deletions(-) diff --git a/core/src/main/java/org/apache/calcite/DataContexts.java b/core/src/main/java/org/apache/calcite/DataContexts.java index a7f1e0f6337c..f0c10c6de0ee 100644 --- a/core/src/main/java/org/apache/calcite/DataContexts.java +++ b/core/src/main/java/org/apache/calcite/DataContexts.java @@ -40,7 +40,7 @@ private DataContexts() { public static final DataContext EMPTY = new EmptyDataContext(); /** Returns an instance of {@link DataContext} with the given map. */ - public static DataContext of(Map map) { + public static DataContext of(Map map) { return new MapDataContext(map); } @@ -85,11 +85,7 @@ 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) { + MapDataContext(Map map) { this.map = ImmutableMap.copyOf(map); } 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 4c8680e0a085..02d5a1517302 100644 --- a/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java +++ b/core/src/main/java/org/apache/calcite/plan/AbstractRelOptPlanner.java @@ -102,9 +102,10 @@ protected AbstractRelOptPlanner(RelOptCostFactory costFactory, this.context = context; this.cancelFlag = - context.maybeUnwrap(CancelFlag.class) - .map(flag -> flag.atomicBoolean) - .orElseGet(AtomicBoolean::new); + requireNonNull( + context.maybeUnwrap(CancelFlag.class) + .map(flag -> flag.atomicBoolean) + .orElseGet(AtomicBoolean::new)); // Add abstract RelNode classes. No RelNodes will ever be registered with // these types, but some operands may use them. 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 c665f78cb3f5..11869ae1fda4 100644 --- a/core/src/main/java/org/apache/calcite/plan/RelOptRuleOperand.java +++ b/core/src/main/java/org/apache/calcite/plan/RelOptRuleOperand.java @@ -168,7 +168,6 @@ public RelOptRule getRule() { * * @param rule containing rule */ - @SuppressWarnings("NullAway") public void setRule(RelOptRule rule) { this.rule = rule; } 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 b82f73b12f5b..db746bc797a9 100644 --- a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java +++ b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java @@ -186,22 +186,6 @@ 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); } @@ -240,15 +224,13 @@ 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. - // The root's parent is null; see removeParents. - removeParents(allNodes, parents); + allNodes.removeAll(parents); targetLeaves = ImmutableList.copyOf(allNodes); allNodes.clear(); parents.clear(); visitor.go(query); - // The root's parent is null; see removeParents. - removeParents(allNodes, parents); + allNodes.removeAll(parents); queryLeaves = ImmutableList.copyOf(allNodes); } 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 f29a7dc97ca3..0ce440e7e2ea 100644 --- a/core/src/main/java/org/apache/calcite/plan/TableAccessMap.java +++ b/core/src/main/java/org/apache/calcite/plan/TableAccessMap.java @@ -113,7 +113,6 @@ public TableAccessMap(List table, Mode mode) { /** * Returns a set of qualified names for all tables accessed. */ - @SuppressWarnings("NullAway") public Set> getTablesAccessed() { return accessMap.keySet(); } 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 cb04e1519e4c..75f8792f4db0 100644 --- a/core/src/main/java/org/apache/calcite/plan/VisitorDataContext.java +++ b/core/src/main/java/org/apache/calcite/plan/VisitorDataContext.java @@ -99,7 +99,7 @@ public VisitorDataContext(@Nullable Object[] values) { List> usageList) { final int size = rowType.getFieldList().size(); final @Nullable Object[] values = new Object[size]; - for (Pair elem : usageList) { + for (Pair elem : usageList) { Pair value = getValue(elem.getKey(), elem.getValue()); if (value == null) { LOGGER.warn("{} is not handled for {} for checking implication", 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 030fb508b4f5..ea4b4e484848 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 @@ -190,7 +190,7 @@ public HepPlanner( super(costFactory, context); this.mainProgram = requireNonNull(program, "program"); this.onCopyHook = - Util.firstNonNull(onCopyHook, + Util.first(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/volcano/RelSubset.java b/core/src/main/java/org/apache/calcite/plan/volcano/RelSubset.java index 60b6855cff40..e2f82e8428de 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 @@ -174,7 +174,6 @@ private void computeBestCost( RelOptPlanner planner) { bestCost = planner.getCostFactory().makeInfiniteCost(); final RelMetadataQuery mq = cluster.getMetadataQuery(); - @SuppressWarnings("NullAway") Iterable rels = getRels(); for (RelNode rel : rels) { final RelOptCost cost = planner.getCost(rel, mq); 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 8c2c3c37c446..6583c2251f11 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 @@ -227,7 +227,6 @@ public VolcanoPlanner(Context externalContext) { /** * Creates a {@code VolcanoPlanner} with a given cost factory. */ - @SuppressWarnings("NullAway") public VolcanoPlanner(@Nullable RelOptCostFactory costFactory, @Nullable Context externalContext) { super(costFactory == null ? VolcanoCost.FACTORY : costFactory, 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 c5a77a825094..01ccde743ecb 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,6 @@ class VolcanoRuleMatch extends VolcanoRuleCall { * can modify it later * @param nodeInputs Map from relational expressions to their inputs */ - @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/rex/RexBuilder.java b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java index 6a5108706519..009823bdbfa0 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexBuilder.java +++ b/core/src/main/java/org/apache/calcite/rex/RexBuilder.java @@ -138,7 +138,6 @@ public class RexBuilder { * * @param typeFactory Type factory */ - @SuppressWarnings("NullAway") public RexBuilder(RelDataTypeFactory typeFactory) { this.typeFactory = typeFactory; this.booleanTrue = 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 ae2a80521450..7832e65e81f6 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexExecutable.java +++ b/core/src/main/java/org/apache/calcite/rex/RexExecutable.java @@ -90,7 +90,7 @@ public void reduce(RexBuilder rexBuilder, List constExps, assert values.length == constExps.size(); final List successfullyReduced = new ArrayList<>(constExps.size()); final List<@Nullable Object> valueList = Arrays.asList(values); - for (Pair value : Pair.zip(constExps, valueList)) { + for (Pair value : Pair.zip(constExps, valueList)) { successfullyReduced.add( rexBuilder.makeLiteral(value.right, value.left.getType(), true)); } 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 1a74d7f5788b..000a7d62f516 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexWindow.java +++ b/core/src/main/java/org/apache/calcite/rex/RexWindow.java @@ -72,7 +72,6 @@ public class RexWindow { * "ROWS BETWEEN 5 PRECEDING AND CURRENT ROW" is printed as * "ROWS 5 PRECEDING". */ - @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 3b922c87b629..d29a4a78c337 100644 --- a/core/src/main/java/org/apache/calcite/rex/RexWindowBound.java +++ b/core/src/main/java/org/apache/calcite/rex/RexWindowBound.java @@ -39,7 +39,6 @@ public static RexWindowBound create(SqlNode node, RexNode rexNode) { * * @return if the bound is unbounded */ - @SuppressWarnings("NullAway") public boolean isUnbounded() { return false; } @@ -77,7 +76,6 @@ public boolean isFollowing() { * * @return if the bound is CURRENT ROW */ - @SuppressWarnings("NullAway") public boolean isCurrentRow() { return false; } 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 0b35d45b219e..b5a8e2f9ac78 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,6 @@ protected DdlExecutorImpl() { /** Dispatches calls to the appropriate method based on the type of the * first argument. */ - @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/sql/SqlDialect.java b/core/src/main/java/org/apache/calcite/sql/SqlDialect.java index f2334f97c436..c7c0c0e5e2cc 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlDialect.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlDialect.java @@ -1546,7 +1546,6 @@ public enum DatabaseProduct { @SuppressWarnings("ImmutableEnumChecker") private final Supplier dialect; - @SuppressWarnings("NullAway") DatabaseProduct(String databaseProductName, @Nullable String quoteString, NullCollation nullCollation) { requireNonNull(databaseProductName, "databaseProductName"); 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 2d06e78240e1..7728fc53254e 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlJdbcFunctionCall.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlJdbcFunctionCall.java @@ -674,7 +674,6 @@ private static class JdbcToInternalLookupTable { private final Map map; - @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/SqlNodeList.java b/core/src/main/java/org/apache/calcite/sql/SqlNodeList.java index bacd3b08ff55..629da67852e8 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlNodeList.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlNodeList.java @@ -169,10 +169,6 @@ 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); } @@ -225,18 +221,10 @@ 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); } 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 9af4a9fb897c..edf215363ea6 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlSetOption.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlSetOption.java @@ -137,7 +137,7 @@ public SqlSetOption(SqlParserPos pos, @Nullable String scope, SqlIdentifier name @SuppressWarnings("NullAway") @Override public List getOperandList() { - final List<@Nullable SqlNode> operandList = new ArrayList<>(); + final List operandList = new ArrayList<>(); if (scope == null) { operandList.add(null); } else { 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 6dcb1f20713f..518ee3cb4277 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlUtil.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlUtil.java @@ -718,7 +718,7 @@ private static Iterator filterRoutinesByParameterTypeAndName( @SuppressWarnings("NullAway") final List<@Nullable RelDataType> paramTypes = operandMetadata.paramTypes(typeFactory); - final List<@Nullable RelDataType> permutedArgTypes; + final @Nullable List<@Nullable RelDataType> permutedArgTypes; if (argNames != null) { final List paramNames = operandMetadata.paramNames(); permutedArgTypes = permuteArgTypes(paramNames, argNames, argTypes); @@ -731,7 +731,7 @@ private static Iterator filterRoutinesByParameterTypeAndName( paramTypes.add(null); } } - for (Pair<@Nullable RelDataType, @Nullable RelDataType> p + for (Pair p : Pair.zip(paramTypes, permutedArgTypes)) { final RelDataType argType = p.right; final RelDataType paramType = p.left; 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 11215bd50760..40010f4a486b 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlWindow.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlWindow.java @@ -913,7 +913,6 @@ private SqlWindowOperator() { return SqlSyntax.SPECIAL; } - @SuppressWarnings("NullAway") @Override public SqlCall createCall( @Nullable SqlLiteral functionQualifier, SqlParserPos pos, 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 e86830b156fd..8d86297ed205 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 @@ -32,10 +32,9 @@ import org.apache.calcite.sql.type.OperandTypes; import org.apache.calcite.sql.type.ReturnTypes; import org.apache.calcite.sql.type.SqlTypeTransforms; +import org.apache.calcite.util.ImmutableNullableList; import org.apache.calcite.util.Litmus; -import org.jspecify.annotations.Nullable; - import java.util.List; /** @@ -57,10 +56,10 @@ private SqlInternalOperators() { new SqlRowOperator("$ANONYMOUS_ROW") { @Override public void unparse(SqlWriter writer, SqlCall call, int leftPrec, int rightPrec) { - @SuppressWarnings("NullAway") - List<@Nullable SqlNode> operandList = call.getOperandList(); + List operandList = call.getOperandList(); writer.list(SqlWriter.FrameTypeEnum.PARENTHESES, SqlWriter.COMMA, - SqlNodeList.of(call.getParserPosition(), operandList)); + SqlNodeList.of(call.getParserPosition(), + ImmutableNullableList.copyOf(operandList))); } }; 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 645e30bdc2ce..eaa4621e10cf 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,6 @@ private SqlLibraryOperatorTableFactory(Class... classes) { /** A cache that returns an operator table for a given library (or set of * libraries). */ - @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/parser/SqlAbstractParserImpl.java b/core/src/main/java/org/apache/calcite/sql/parser/SqlAbstractParserImpl.java index 5b8a4bb9e54c..3e642683beef 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 @@ -431,7 +431,6 @@ public static Set getSql92ReservedWords() { * @param operands Operands to call * @return Call */ - @SuppressWarnings("NullAway") protected SqlCall createCall( SqlIdentifier funName, SqlParserPos pos, 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 486c586ed51d..e340ffbc41f8 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 @@ -978,7 +978,7 @@ private static SqlNode convert(PrecedenceClimbingParser.Token token) { case CALL: final PrecedenceClimbingParser.Call call = (PrecedenceClimbingParser.Call) token; - final List<@Nullable SqlNode> list = new ArrayList<>(); + final List list = new ArrayList<>(); for (PrecedenceClimbingParser.Token arg : call.args) { list.add(convert(arg)); } 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 e4c987f20994..300285a67490 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 @@ -287,7 +287,6 @@ public class SqlPrettyWriter implements SqlWriter { //~ Constructors ----------------------------------------------------------- - @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/type/SqlTypeUtil.java b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeUtil.java index a2e8d170daf0..7ee033a5f6b4 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 @@ -485,13 +485,11 @@ public static boolean isTimestamp(RelDataType type) { } /** Returns whether a type is some kind of INTERVAL. */ - @SuppressWarnings("NullAway") public static boolean isInterval(RelDataType type) { return SqlTypeFamily.DATETIME_INTERVAL.contains(type); } /** Returns whether a type is in SqlTypeFamily.Character. */ - @SuppressWarnings("NullAway") public static boolean inCharFamily(RelDataType type) { return type.getFamily() == SqlTypeFamily.CHARACTER; } 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 f9b58ad37670..4a35cd739570 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 @@ -74,7 +74,6 @@ 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("NullAway") public final Supplier resolved = Suppliers.memoize(this::resolve); 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 6d54c876b25f..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 @@ -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/SqlValidatorException.java b/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorException.java index a681e43a358b..b2bd9c6146a6 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,6 @@ public class SqlValidatorException extends Exception * @param message error message * @param cause underlying cause */ - @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 bb669658b194..7210472324b7 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 @@ -4720,7 +4720,7 @@ private void checkRollUp(@Nullable SqlNode grandParent, @Nullable SqlNode parent } else if (stripDot.getKind() == SqlKind.LAMBDA) { // do not need to check lambda } else { - List children = + List children = ((SqlCall) stripDot).getOperandList(); for (SqlNode child : children) { checkRollUp(parent, current, child, scope, contextClause); 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 1d89431d0804..0b97bad8c83b 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/ReflectiveConvertletTable.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/ReflectiveConvertletTable.java @@ -86,7 +86,6 @@ private void registerNodeTypeMethod( } map.put(parameterType, (SqlRexConvertlet) (cx, call) -> { try { - @SuppressWarnings("NullAway") RexNode result = (RexNode) method.invoke(ReflectiveConvertletTable.this, cx, call); return requireNonNull(result, @@ -131,7 +130,6 @@ private void registerOpTypeMethod( } map.put(opClass, (SqlRexConvertlet) (cx, call) -> { try { - @SuppressWarnings("NullAway") RexNode result = (RexNode) method.invoke(ReflectiveConvertletTable.this, cx, call.getOperator(), call); 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 c2bf100e4891..b1973e776e56 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java @@ -132,7 +132,6 @@ public class RelFieldTrimmer implements ReflectiveVisitor { public RelFieldTrimmer(@Nullable SqlValidator validator, RelBuilder relBuilder) { Util.discard(validator); // may be useful one day this.relBuilder = relBuilder; - @SuppressWarnings("NullAway") ReflectUtil.MethodDispatcher dispatcher = ReflectUtil.createMethodDispatcher( TrimResult.class, 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 8206502440b3..e19b638ddc7b 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java @@ -4937,17 +4937,6 @@ private RexNode convertIdentifier( String pv = null; if (bb.isPatternVarRef && identifier.names.size() > 1) { pv = identifier.names.get(0); - // Unqualified, or qualified by a non pattern variable, means universal variable "*". - final SqlValidator validator = bb.getValidator(); - final SqlNode original = validator instanceof SqlValidatorImpl - ? ((SqlValidatorImpl) validator).getOriginal(identifier) : identifier; - final boolean unqualified = original instanceof SqlIdentifier - && ((SqlIdentifier) original).names.size() == 1; - if (unqualified - || (bb.scope instanceof MatchRecognizeScope - && !((MatchRecognizeScope) bb.scope).getPatternVars().contains(pv))) { - pv = "*"; - } } final @Nullable SqlNode measure = bb.lookupMeasure(identifier); 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 41559298fcdd..247155adfb41 100644 --- a/core/src/main/java/org/apache/calcite/sql2rel/TopDownGeneralDecorrelator.java +++ b/core/src/main/java/org/apache/calcite/sql2rel/TopDownGeneralDecorrelator.java @@ -137,7 +137,6 @@ public class TopDownGeneralDecorrelator implements ReflectiveVisitor { // invokes using reflection a method named unnestInternal based on the // runtime type of the argument. - @SuppressWarnings("NullAway") private final ReflectUtil.MethodDispatcher dispatcher = ReflectUtil.createMethodDispatcher( RelNode.class, getVisitor(), "unnestInternal", RelNode.class, boolean.class); 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 b9cc52065264..590e3fd290c5 100644 --- a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java +++ b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java @@ -236,8 +236,9 @@ protected RelBuilder(@Nullable Context context, RelOptCluster cluster, */ private static RelOptTable.ViewExpander getViewExpander(RelOptCluster cluster, Context context) { - return context.maybeUnwrap(RelOptTable.ViewExpander.class) - .orElseGet(() -> ViewExpanders.simpleContext(cluster)); + return requireNonNull( + context.maybeUnwrap(RelOptTable.ViewExpander.class) + .orElseGet(() -> ViewExpanders.simpleContext(cluster))); } /** Derives the Config to be used for this RelBuilder. @@ -2338,7 +2339,7 @@ public RelBuilder projectNamed(Iterable nodes, @SuppressWarnings({"unchecked", "rawtypes"}) final List nodeList = nodes instanceof List ? (List) nodes : ImmutableList.copyOf(nodes); - final List<@Nullable String> fieldNameList = + final @Nullable List<@Nullable String> fieldNameList = fieldNames == null ? null : fieldNames instanceof List ? (List<@Nullable String>) fieldNames : ImmutableNullableList.copyOf(fieldNames); @@ -3580,7 +3581,7 @@ public RelBuilder values(@Nullable String[] fieldNames, @Nullable Object... valu "Value count must be a positive multiple of field count"); } final int rowCount = values.length / fieldNames.length; - for (Ord<@Nullable String> fieldName : Ord.zip(fieldNames)) { + for (Ord fieldName : Ord.zip(fieldNames)) { if (allNull(values, fieldName.i, fieldNames.length)) { throw new IllegalArgumentException("All values of field '" + fieldName.e + "' (field index " + fieldName.i + ")" 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 517a9180aa0a..fa6cd77cec13 100644 --- a/core/src/main/java/org/apache/calcite/util/BlackholeMap.java +++ b/core/src/main/java/org/apache/calcite/util/BlackholeMap.java @@ -94,12 +94,10 @@ public static Set of() { private BlackholeMap() {} - @SuppressWarnings("NullAway") @Override public @Nullable V put(K key, V value) { return null; } - @SuppressWarnings("NullAway") @Override public Set> entrySet() { return BHSet.of(); } 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 2a2f8252298f..06ba497e93f1 100644 --- a/core/src/main/java/org/apache/calcite/util/CompositeMap.java +++ b/core/src/main/java/org/apache/calcite/util/CompositeMap.java @@ -70,7 +70,6 @@ private static ImmutableList list(E e, E[] es) { return true; } - @SuppressWarnings("NullAway") @Override public boolean containsKey(@Nullable Object key) { for (Map map : maps) { if (map.containsKey(key)) { @@ -119,7 +118,6 @@ private static ImmutableList list(E e, E[] es) { throw new UnsupportedOperationException(); } - @SuppressWarnings("NullAway") @Override public Set keySet() { final Set keys = new LinkedHashSet<>(); for (Map map : maps) { @@ -145,7 +143,6 @@ private Map combinedMap() { return combinedMap().values(); } - @SuppressWarnings("NullAway") @Override public Set> entrySet() { return combinedMap().entrySet(); } 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 1c178b7f47be..d0fe7952af22 100644 --- a/core/src/main/java/org/apache/calcite/util/DateString.java +++ b/core/src/main/java/org/apache/calcite/util/DateString.java @@ -48,7 +48,6 @@ private DateString(String v, @SuppressWarnings("unused") boolean ignore) { } /** Creates a DateString. */ - @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/ImmutableIntList.java b/core/src/main/java/org/apache/calcite/util/ImmutableIntList.java index 0be7eee90bd5..d23dbcbc8eb2 100644 --- a/core/src/main/java/org/apache/calcite/util/ImmutableIntList.java +++ b/core/src/main/java/org/apache/calcite/util/ImmutableIntList.java @@ -135,7 +135,6 @@ private static ImmutableIntList copyFromCollection( return Arrays.hashCode(ints); } - @SuppressWarnings("NullAway") @Override public boolean equals(@Nullable Object obj) { return ((this == obj) || (obj instanceof ImmutableIntList)) 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 f814c3a49cb8..d13603509703 100644 --- a/core/src/main/java/org/apache/calcite/util/JsonBuilder.java +++ b/core/src/main/java/org/apache/calcite/util/JsonBuilder.java @@ -162,7 +162,7 @@ private void appendMap( buf.append("{"); newline(buf, indent + 1); int n = 0; - for (Map.Entry entry : map.entrySet()) { + for (Map.Entry entry : map.entrySet()) { if (n++ > 0) { buf.append(","); newline(buf, indent + 1); 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 7891d4b4bae7..4ced1cbf04bd 100644 --- a/core/src/main/java/org/apache/calcite/util/NumberUtil.java +++ b/core/src/main/java/org/apache/calcite/util/NumberUtil.java @@ -151,13 +151,7 @@ public static long round(double d) { /** Returns the sum of two numbers, or null if either is 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) { + if (a == null || b == null) { return null; } 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 aa09108f068b..be1a35c2d95d 100644 --- a/core/src/main/java/org/apache/calcite/util/PartiallyOrderedSet.java +++ b/core/src/main/java/org/apache/calcite/util/PartiallyOrderedSet.java @@ -134,7 +134,6 @@ public PartiallyOrderedSet(Ordering ordering, * @param ordering Ordering relation * @param collection Initial contents of partially-ordered set */ - @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 58ba67b1d72e..e27be204b737 100644 --- a/core/src/main/java/org/apache/calcite/util/Permutation.java +++ b/core/src/main/java/org/apache/calcite/util/Permutation.java @@ -44,7 +44,6 @@ public class Permutation implements Mapping, Mappings.TargetMapping { * * @param size Number of elements in the permutation */ - @SuppressWarnings("NullAway") public Permutation(int size) { targets = new int[size]; sources = new int[size]; 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 bf05ac17e9ab..cfb387a180c7 100644 --- a/core/src/main/java/org/apache/calcite/util/Sarg.java +++ b/core/src/main/java/org/apache/calcite/util/Sarg.java @@ -65,7 +65,6 @@ * * @see SqlStdOperatorTable#SEARCH */ -@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/SimpleNamespaceContext.java b/core/src/main/java/org/apache/calcite/util/SimpleNamespaceContext.java index 3a2a4775c227..d2c9168d65e9 100644 --- a/core/src/main/java/org/apache/calcite/util/SimpleNamespaceContext.java +++ b/core/src/main/java/org/apache/calcite/util/SimpleNamespaceContext.java @@ -36,7 +36,6 @@ public class SimpleNamespaceContext implements NamespaceContext { private final Map prefixToNamespaceUri = new HashMap<>(); private final Map> namespaceUriToPrefixes = new HashMap<>(); - @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/TimeString.java b/core/src/main/java/org/apache/calcite/util/TimeString.java index 172d90ab427c..afcc61161b06 100644 --- a/core/src/main/java/org/apache/calcite/util/TimeString.java +++ b/core/src/main/java/org/apache/calcite/util/TimeString.java @@ -53,7 +53,6 @@ private TimeString(String v, @SuppressWarnings("unused") boolean ignore) { } /** Creates a TimeString. */ - @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/Util.java b/core/src/main/java/org/apache/calcite/util/Util.java index e12f261e6f0e..c27bd50dd9ad 100644 --- a/core/src/main/java/org/apache/calcite/util/Util.java +++ b/core/src/main/java/org/apache/calcite/util/Util.java @@ -2132,6 +2132,22 @@ public static List> pairs(final List list) { 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. Where the result feeds a generic call, NullAway reads + * the {@code @Contract} on {@code first} too late to constrain the type argument, and the + * non-null return type here is what the inference needs. + * + * @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; + } + /** Unboxes a {@link Double} value, * using a given default value if it is null. */ public static double first(@Nullable Double v0, double v1) { @@ -2293,7 +2309,7 @@ public static boolean isDistinct(List list) { return -1; } // we use HashMap here, because it is more efficient than HashSet. - final Map set = new HashMap<>(size); + final Map<@Nullable E, Object> set = new HashMap<>(size); for (E e : list) { if (set.put(e, "") != null) { return set.size(); 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 f025c5df6374..5d43432d36d9 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 @@ -93,7 +93,6 @@ private String toString(Ordering vertexOrdering, @API(since = "1.26", status = API.Status.EXPERIMENTAL) protected final VertexInfo getVertex(V vertex) { - @SuppressWarnings("NullAway") final VertexInfo info = vertexMap.get(vertex); if (info == null) { throw new IllegalArgumentException("no vertex " + vertex); 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 caf22543736f..84ac5b57ad50 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,6 @@ protected AbstractSourceMapping(int sourceCount, int targetCount) { return MappingType.INVERSE_PARTIAL_FUNCTION; } - @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 375bf4081046..202fa9e28537 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,6 @@ protected AbstractTargetMapping(int sourceCount, int targetCount) { return MappingType.PARTIAL_FUNCTION; } - @SuppressWarnings("NullAway") @Override public Iterator iterator() { return new Iterator() { int source = -1; 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 9592ee095290..1aa59b846c0c 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 @@ -1716,7 +1716,6 @@ private static class PartialFunctionImpl extends AbstractMapping return size; } - @SuppressWarnings("NullAway") @Override public Iterator iterator() { return new Iterator() { int i = -1; 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 c10a17dfca14..51f21e2ccc85 100644 --- a/core/src/test/java/org/apache/calcite/plan/RelWriterTest.java +++ b/core/src/test/java/org/apache/calcite/plan/RelWriterTest.java @@ -1634,7 +1634,7 @@ void testUDAF(SqlExplainFormat format) { /** Returns the schema of a {@link org.apache.calcite.rel.core.TableScan} * in this plan, or null if there are no scans. */ private static RelOptSchema getSchema(RelNode rel) { - final Holder<@Nullable RelOptSchema> schemaHolder = Holder.empty(); + final Holder schemaHolder = Holder.empty(); rel.accept( new RelShuttleImpl() { @Override public RelNode visit(TableScan scan) { 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 7dc5275f840f..830a9979ae3a 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,6 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.Locale; @@ -345,7 +344,7 @@ private void verify(RelNode rel, String expectedPhysical, String expectedLogical @Test void testCorrelation() { final RelBuilder builder = builder(); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); final RelNode rel = builder.scan("EMP") .variable(v::set) .scan("DEPT") 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 e1da1ab48792..add670903d59 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 @@ -7946,8 +7946,8 @@ private void checkLiteral2(String expression, String expected) { + "MEASURES " + "FINAL \"STRT\".\"net_weight\" AS \"START_NW\", " + "FINAL COUNT(\"UP\".\"net_weight\") AS \"UP_CNT\", " - + "FINAL COUNT(\"net_weight\") AS \"DOWN_CNT\", " - + "FINAL (RUNNING COUNT(\"net_weight\")) AS \"RUNNING_CNT\"\n" + + "FINAL COUNT(\"product\".\"net_weight\") AS \"DOWN_CNT\", " + + "FINAL (RUNNING COUNT(\"product\".\"net_weight\")) AS \"RUNNING_CNT\"\n" + "ONE ROW PER MATCH\n" + "AFTER MATCH SKIP TO NEXT ROW\n" + "PATTERN (\"STRT\" \"DOWN\" + \"UP\" +)\n" 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 0bee7d0ef1bd..7b5d625a5ac1 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,6 @@ import org.apache.calcite.tools.RelBuilder; import org.apache.calcite.util.Holder; -import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.List; @@ -53,7 +52,7 @@ public static Frameworks.ConfigBuilder config() { @Test void testSingleCorrelationCallOverVariableInFilter() { final RelBuilder builder = RelBuilder.create(config().build()); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); RelNode before = builder.scan("EMP") .variable(v::set) .scan("DEPT") @@ -88,7 +87,7 @@ public static Frameworks.ConfigBuilder config() { * CorrelateProjectExtractor does not handle nested field accesses cor0.field0.field1. */ @Test void testNestedCorrelationFieldAccessInFilter() { final RelBuilder builder = RelBuilder.create(config().build()); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); RelNode before = builder.scan("EMP") .project( builder.alias( @@ -125,7 +124,7 @@ public static Frameworks.ConfigBuilder config() { * not prevent extracting the enclosing correlated call. */ @Test void testCorrelationCallWithConstantCallOperandInFilter() { final RelBuilder builder = RelBuilder.create(config().build()); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); RelNode before = builder.scan("EMP") .variable(v::set) .scan("DEPT") @@ -158,7 +157,7 @@ public static Frameworks.ConfigBuilder config() { @Test void testDoubleCorrelationCallOverVariableInFilters() { final RelBuilder builder = RelBuilder.create(config().build()); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); RelNode before = builder .scan("EMP") .variable(v::set) 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 8c2d424133f3..ef22e7ae0711 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,6 @@ import com.google.common.collect.ImmutableList; -import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.Collections; @@ -173,7 +172,7 @@ public static Frameworks.ConfigBuilder config() { @Test void testGroupKeyNotInFrontWhenDecorrelate() { final RelBuilder builder = RelBuilder.create(config().build()); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); RelNode before = builder.scan("EMP") .variable(v::set) .scan("DEPT") 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 c1a23161e154..20e948333fff 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,6 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; -import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Test; import java.util.Collections; @@ -589,7 +588,7 @@ public static Frameworks.ConfigBuilder config() { */ @Test void testLogicalCorrelateFieldTrimmer() { final RelBuilder builder = RelBuilder.create(config().build()); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); RelNode root = builder.scan("EMP") .projectPlus(builder.call(SqlStdOperatorTable.PLUS, builder.field(0), builder.field(0))) .variable(v::set) @@ -633,7 +632,7 @@ public static Frameworks.ConfigBuilder config() { */ @Test void testLogicalCorrelateFieldTrimmer2() { final RelBuilder builder = RelBuilder.create(config().build()); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); RelNode root = builder.scan("EMP") .projectPlus(builder.call(SqlStdOperatorTable.PLUS, builder.field(0), builder.field(0))) .variable(v::set) @@ -682,7 +681,7 @@ public static Frameworks.ConfigBuilder config() { */ @Test void testTrimCorrelatedSubquery() { final RelBuilder builder = RelBuilder.create(config().build()); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); builder.scan("EMP") .variable(v::set) .filter( @@ -734,7 +733,7 @@ public static Frameworks.ConfigBuilder config() { */ @Test void testTrimCorrelatedSubqueryInFilterCondition() { final RelBuilder builder = RelBuilder.create(config().build()); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); RelNode original = builder.scan("EMP") .variable(v::set) .filter(ImmutableList.of(v.get().id), @@ -775,7 +774,7 @@ public static Frameworks.ConfigBuilder config() { @Test void testTrimCorrelatedSubqueryInJoinCondition() { final RelBuilder builder = RelBuilder.create(config().build()); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); final RelNode original = builder.scan("EMP") .variable(v::set) 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 e552642afdb8..63082c39900f 100644 --- a/core/src/test/java/org/apache/calcite/test/InterpreterTest.java +++ b/core/src/test/java/org/apache/calcite/test/InterpreterTest.java @@ -262,7 +262,7 @@ private static void assertInterpret(RelNode rel, DataContext dataContext, final List fieldTypes = Util.transform(rel.getRowType().getFieldList(), RelDataTypeField::getType); - final Function<@Nullable Object[], List<@Nullable Object>> converter = + final Function> converter = EnumUtils.toExternal(fieldTypes, DateTimeUtils.DEFAULT_ZONE); assertRows(interpreter, converter, unordered, rows); } 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 97060ffbad33..0714beb1a71b 100644 --- a/core/src/test/java/org/apache/calcite/test/LintTest.java +++ b/core/src/test/java/org/apache/calcite/test/LintTest.java @@ -31,11 +31,8 @@ import org.junit.jupiter.api.Test; import java.io.File; -import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.util.ArrayList; import java.util.Comparator; import java.util.HashSet; @@ -69,12 +66,6 @@ class LintTest { compile("^(\\[CALCITE-[0-9]{1,4}][ ]).*"); private static final Pattern PATTERN = compile("^ *(// )?"); - private static final String PACKAGE_INFO = "package-info.java"; - /** Source roots that NullAway verifies; see {@code nullawayProjects} in the root - * {@code build.gradle.kts}. */ - private static final List NULL_MARKED_ROOTS = - ImmutableList.of("linq4j/src/main/java/", "core/src/main/java/"); - private static final Pattern COMMONS_LANG3_IMPORT_PATTERN = compile("^\\s*import\\s+(static\\s+)?" + "org\\.apache\\.commons\\.lang3\\..*;\\s*$"); @@ -373,65 +364,6 @@ private static boolean isJava(String filename) { assertThat(g.messages, empty()); } - /** Fails when a main-source package is not declared {@code @NullMarked}. - * - *

    NullAway analyzes {@code @NullMarked} code only, so a package that forgets the - * annotation is silently skipped rather than reported. Add a {@code package-info.java} - * to the new package, copying the {@code @NullMarked} declaration from a sibling - * package. - * - *

    Only the main sources of the modules that NullAway verifies are checked. Marking a - * package that nobody verifies would claim a guarantee that nothing backs. Widen - * {@link #NULL_MARKED_ROOTS} together with {@code nullawayProjects}. - * - *

    A package that spans both modules needs only one {@code package-info.java}, in - * either of them, because a second one would put a duplicate class on the classpath. */ - @Test void testLintNullMarked() throws IOException { - assumeTrue(TestUnsafe.haveGit(), "Invalid git environment"); - - final List messages = new ArrayList<>(); - final Set mainPackages = new HashSet<>(); - final Set markedPackages = new HashSet<>(); - for (File file : TestUnsafe.getJavaFiles()) { - final String path = file.getPath().replace(File.separatorChar, '/'); - final String root = - NULL_MARKED_ROOTS.stream() - .filter(path::contains) - .findFirst() - .orElse(null); - if (root == null) { - continue; - } - final int i = path.indexOf(root) + root.length(); - final String packageName = - path.substring(i, path.lastIndexOf('/')).replace('/', '.'); - mainPackages.add(packageName); - if (file.getName().equals(PACKAGE_INFO)) { - if (isNullMarked(file)) { - markedPackages.add(packageName); - } else { - messages.add(file + ": " + PACKAGE_INFO + " is not annotated @NullMarked"); - } - } - } - mainPackages.stream() - .filter(packageName -> !markedPackages.contains(packageName)) - .map(packageName -> - packageName + ": package has no " + PACKAGE_INFO + " declaring @NullMarked") - .sorted() - .forEach(messages::add); - - messages.forEach(System.out::println); - assertThat(messages, empty()); - } - - private static boolean isNullMarked(File file) throws IOException { - try (Stream lines = - Files.lines(file.toPath(), StandardCharsets.UTF_8)) { - return lines.anyMatch(line -> line.startsWith("@NullMarked")); - } - } - /** Tests that the most recent N commit messages are good. * *

    N needs to be large enough to verify multi-commit PRs, but not so large 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 c3e1290edec5..d6b4361dfe72 100644 --- a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java @@ -105,7 +105,6 @@ 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; @@ -3279,7 +3278,7 @@ private static RelBuilder assertSize(RelBuilder b, @Test void testCorrelationFails() { final RelBuilder builder = RelBuilder.create(config().build()); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); try { builder.scan("EMP") .variable(v::set) @@ -3296,7 +3295,7 @@ private static RelBuilder assertSize(RelBuilder b, @Test void testCorrelationWithCondition() { final RelBuilder builder = RelBuilder.create(config().build()); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); RelNode root = builder.scan("EMP") .variable(v::set) .scan("DEPT") @@ -3321,7 +3320,7 @@ private static RelBuilder assertSize(RelBuilder b, @Test void testTrivialCorrelation() { final RelBuilder builder = RelBuilder.create(config().build()); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); RelNode root = builder.scan("EMP") .variable(v::set) .scan("DEPT") @@ -3424,7 +3423,7 @@ private static RelBuilder assertSize(RelBuilder b, // FROM dept // WHERE deptno = emp.deptno) final Function f = b -> { - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); return b.scan("EMP") .variable(v::set) .filter(ImmutableList.of(v.get().id), @@ -5249,7 +5248,7 @@ private static RelBuilder assertSize(RelBuilder b, /** Tests filter builder with correlation variables. */ @Test void testFilterWithCorrelationVariables() { final RelBuilder builder = RelBuilder.create(config().build()); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); RelNode root = builder.scan("EMP") .variable(v::set) .scan("DEPT") @@ -5434,7 +5433,7 @@ private void checkExpandTable(RelBuilder builder, Matcher matcher) { @Test void testCorrelate() { final RelBuilder builder = RelBuilder.create(config().build()); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); RelNode root = builder.scan("EMP") .variable(v::set) .scan("DEPT") @@ -5658,7 +5657,7 @@ private static RelNode buildSimpleCorrelateWithJoin(JoinRelType type) { } private static RelNode buildSimpleCorrelateWithJoin(JoinRelType type, RelBuilder builder) { - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); return builder .scan("EMP") .variable(v::set) @@ -5676,7 +5675,7 @@ private static RelNode buildCorrelateWithJoin(JoinRelType type) { private static RelNode buildCorrelateWithJoin(JoinRelType type, RelBuilder builder) { final RexBuilder rexBuilder = builder.getRexBuilder(); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); return builder .scan("EMP") .variable(v::set) @@ -5694,7 +5693,7 @@ private static RelNode buildCorrelateWithJoin(JoinRelType type, RelBuilder build @Test void testCorrelateWithComplexFields() { final RelBuilder builder = RelBuilder.create(config().build()); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); RelNode root = builder.scan("EMP") .variable(v::set) .scan("DEPT") 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 efccc070148d..8acaf2c88571 100644 --- a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java @@ -2269,7 +2269,7 @@ private void checkColumnUniquenessForJoin(String sql) { .distinct() .filter(b.equals(b.field("SAL"), b.literal(1))) .build(); - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); final RelNode rel1 = b.scan("EMP") .variable(v::set) .project(b.field("DEPTNO"), b.field("SAL")) @@ -3631,7 +3631,7 @@ private void checkAverageRowSize(RelOptCluster cluster, RelOptTable empTable, private void checkSize(String query, double expected) { final RelNode rel = sql(query).toRel(); final RelMetadataQuery mq = rel.getCluster().getMetadataQuery(); - final List<@Nullable Double> averageColumnSizes = mq.getAverageColumnSizes(rel); + final List averageColumnSizes = mq.getAverageColumnSizes(rel); assertNotNull(averageColumnSizes); assertThat(averageColumnSizes, hasSize(1)); assertThat(averageColumnSizes.get(0), is(expected)); 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 385fe5950c31..0bf0dd8a7ac8 100644 --- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java @@ -9906,7 +9906,7 @@ private void checkSemiJoinRuleOnAntiJoin(RelOptRule rule) { // from emp // where dept.deptno = emp.deptno // and emp.sal > 100) - final Holder<@Nullable RexCorrelVariable> v = Holder.empty(); + final Holder v = Holder.empty(); final Function relFn = b -> b .scan("DEPT") .variable(v::set) 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 130a1949e0bf..5ea0488f5497 100644 --- a/core/src/test/java/org/apache/calcite/util/UtilTest.java +++ b/core/src/test/java/org/apache/calcite/util/UtilTest.java @@ -54,8 +54,6 @@ 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; @@ -249,7 +247,7 @@ class UtilTest { } @Test void testJoinNullable() { - final List<@Nullable Object> parts = Arrays.asList("a", null, "b"); + final List parts = Arrays.asList("a", null, "b"); assertThat(Util.joinNullable(parts, ":"), is("a::b")); assertThat(Util.joinNullable(Collections.emptyList(), ","), is("")); assertThat(Util.joinNullable(Arrays.asList(null, null), ":"), is(":")); @@ -2518,7 +2516,7 @@ private void checkListToString(String... strings) { assertThat(local1.get(), is("foo")); local1.set(null); // null values are allowed - final TryThreadLocal<@Nullable String> local2 = + final TryThreadLocal local2 = TryThreadLocal.of(null); assertThat(local2.get(), nullValue()); TryThreadLocal.Memo memo2 = local2.push("a"); @@ -2539,7 +2537,7 @@ private void checkListToString(String... strings) { } assertThat(local2.get(), is("x")); - final Supplier<@NonNull String> stringSupplier = + final Supplier stringSupplier = new Supplier() { final Random random = new Random(); @@ -2564,7 +2562,7 @@ private void checkListToString(String... strings) { } @SuppressWarnings("DataFlowIssue") - final Supplier<@NonNull String> nullSupplier = () -> null; + final Supplier nullSupplier = () -> null; final TryThreadLocal local4 = TryThreadLocal.withInitial(nullSupplier); local4.set("abc"); diff --git a/core/src/test/resources/sql/match.iq b/core/src/test/resources/sql/match.iq index b710a2383d46..edee26b9696d 100644 --- a/core/src/test/resources/sql/match.iq +++ b/core/src/test/resources/sql/match.iq @@ -172,41 +172,6 @@ C CL EMPID !ok -# Test case for CALCITE-7734 -# An unqualified column in DEFINE/MEASURES resolves to the universal row pattern -# variable "*", not to the table name; the plan must show LAST(*.$4, ...). -select * -from "hr"."emps" match_recognize ( - order by "empid" desc - measures "commission" as c - pattern (s up) - define up as "commission" < prev("commission")); -EnumerableMatch(partition=[[]], order=[[0 DESC]], outputFields=[[C]], allRows=[false], after=[FLAG(SKIP TO NEXT ROW)], pattern=[('S', 'UP')], isStrictStarts=[false], isStrictEnds=[false], subsets=[[]], patternDefinitions=[[<(LAST(*.$4, 0), LAST(*.$4, 1))]], inputFields=[[empid, deptno, name, salary, commission]]) - EnumerableTableScan(table=[[hr, emps]]) -!plan - -# [CALCITE-7734] An unqualified column resolves to "*" even when the input alias collides with a pattern variable. -select * -from "hr"."emps" as "A" match_recognize ( - order by "empid" desc - measures "commission" as c - pattern ("A" up) - define up as "commission" < prev("commission")); -EnumerableMatch(partition=[[]], order=[[0 DESC]], outputFields=[[C]], allRows=[false], after=[FLAG(SKIP TO NEXT ROW)], pattern=[('A', 'UP')], isStrictStarts=[false], isStrictEnds=[false], subsets=[[]], patternDefinitions=[[<(LAST(*.$4, 0), LAST(*.$4, 1))]], inputFields=[[empid, deptno, name, salary, commission]]) - EnumerableTableScan(table=[[hr, emps]]) -!plan - -# [CALCITE-7734] A column explicitly qualified by a pattern variable still resolves to that variable. -select * -from "hr"."emps" as "A" match_recognize ( - order by "empid" desc - measures "A"."commission" as c - pattern ("A" up) - define up as "A"."commission" < prev("A"."commission")); -EnumerableMatch(partition=[[]], order=[[0 DESC]], outputFields=[[C]], allRows=[false], after=[FLAG(SKIP TO NEXT ROW)], pattern=[('A', 'UP')], isStrictStarts=[false], isStrictEnds=[false], subsets=[[]], patternDefinitions=[[<(LAST(A.$4, 0), LAST(A.$4, 1))]], inputFields=[[empid, deptno, name, salary, commission]]) - EnumerableTableScan(table=[[hr, emps]]) -!plan - !if (false) { # Match recognize SELECT * 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 37b5cbdca775..c067ae989d21 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/BaseQueryable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/BaseQueryable.java @@ -23,6 +23,8 @@ import java.lang.reflect.Type; import java.util.Iterator; +import static java.util.Objects.requireNonNull; + /** * Skeleton implementation of {@link Queryable}. * @@ -34,11 +36,13 @@ */ public abstract class BaseQueryable extends AbstractQueryable { - protected final QueryProvider provider; + /** Provider, or null for a queryable that overrides {@link #enumerator()} + * and so never asks the provider to execute it. */ + protected final @Nullable QueryProvider provider; protected final Type elementType; protected final @Nullable Expression expression; - protected BaseQueryable(QueryProvider provider, Type elementType, + protected BaseQueryable(@Nullable QueryProvider provider, Type elementType, @Nullable Expression expression) { this.provider = provider; this.elementType = elementType; @@ -46,7 +50,7 @@ protected BaseQueryable(QueryProvider provider, Type elementType, } @Override public QueryProvider getProvider() { - return provider; + return requireNonNull(provider, "provider"); } @Override public Type getElementType() { @@ -62,6 +66,6 @@ protected BaseQueryable(QueryProvider provider, Type elementType, } @Override public Enumerator enumerator() { - return provider.executeQuery(this); + return getProvider().executeQuery(this); } } 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 f2d2741ea132..e3b9e8f3637b 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/DefaultEnumerable.java @@ -54,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" 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 425ea1f81589..b42286a2d569 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/EnumerableDefaults.java @@ -105,6 +105,7 @@ public abstract class EnumerableDefaults { // 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, @@ -128,6 +129,7 @@ public abstract class EnumerableDefaults { // 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( 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 171b3e7d9303..be0169e35571 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/ExtendedEnumerable.java @@ -48,7 +48,7 @@ * * @param Element type */ -public interface ExtendedEnumerable { +public interface ExtendedEnumerable { /** * Performs an operation for each member of this enumeration. 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/Linq4j.java b/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java index 118b91eccbca..67dbdc9ade9b 100644 --- a/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java +++ b/linq4j/src/main/java/org/apache/calcite/linq4j/Linq4j.java @@ -670,6 +670,7 @@ private static class SingletonEnumerator implements Enumerator { /** Enumerator that returns one null element. * * @param element type */ + @SuppressWarnings("NullAway") // only meaningful when E is instantiated nullable private static class SingletonNullEnumerator implements Enumerator { int i = 0; 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/RawEnumerable.java b/linq4j/src/main/java/org/apache/calcite/linq4j/RawEnumerable.java index 18d6c701cd7b..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,6 +16,8 @@ */ package org.apache.calcite.linq4j; +import org.jspecify.annotations.Nullable; + /** * Exposes the enumerator, which supports a simple iteration over a collection, * without the extension methods. @@ -29,7 +31,7 @@ * @param Element type * @see Enumerable */ -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/function/Functions.java b/linq4j/src/main/java/org/apache/calcite/linq4j/function/Functions.java index a7a32fc63c6c..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 @@ -860,6 +860,7 @@ private static class NullsLastReverseComparator * @param result type * @param first argument type * @param second argument type */ + @SuppressWarnings("NullAway") // only meaningful when R is instantiated nullable private static final class Ignore implements Function0, Function1, Function2 { @Override public R apply() { From b6a4afddd09ecea5b95a0a7dea4b1d4159a5cd5e Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 19:45:46 +0300 Subject: [PATCH 40/60] [CALCITE-7736] Let NullAway itself require the explicit null-marking NullAway 0.12.13 and later ship a RequireExplicitNullMarking Error Prone check that fails a top-level class which is neither annotated nor covered by an annotated package or module. It is what the OnlyNullMarked setting needs, and it is stricter than the LintTest check it replaces: a class that sits in a package with no package-info.java is reported by name, whether or not the package holds a package-info.java at all. Co-Authored-By: Claude Opus 5 --- build.gradle.kts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index 9b9e3dfb3be2..83cc584c3b7c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -935,6 +935,9 @@ allprojects { 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") From bffba1c6ed5106510939dbb3b754c6ccefbbc36b Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 19:51:59 +0300 Subject: [PATCH 41/60] [CALCITE-7736] Put :server back under nullness verification The Checker Framework covered :server as well, so NullAway takes it over. The module needs no source changes: its four main classes live in org.apache.calcite.server, a package that :core already declares @NullMarked, and the generated DDL parser sits under a javacc directory, which the XepExcludedPaths setting skips the way AskipDefs used to. Co-Authored-By: Claude Opus 5 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 83cc584c3b7c..fe3857ab150e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -165,7 +165,7 @@ val werror by props(true) // treat javac warnings as errors // 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") +val nullawayProjects = listOf(":linq4j", ":core", ":server") val hepLargePlanModeTestIncludes = mapOf( ":core" to listOf( From 0ab1e27131fda90992267ed3968408484d9b3425 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 20:14:17 +0300 Subject: [PATCH 42/60] [CALCITE-7736] Put :druid under nullness verification The Druid adapter now declares its package @NullMarked, and NullAway verifies it. Most of the change is stating in the signatures what the bodies already did: a visitor over a Druid column returns a pair whose halves are both absent when the column cannot be pushed down, an extraction function carries no granularity and no locale, and the filters and plans that writeFieldIf skips take an absent value. Three places said something the code did not mean. Only the Checker Framework needed the preconditions on DruidTable.create and DruidType.getTypeFromMetric, whose callers are now the ones that check. DruidProjectRule named a field null for an expression that is not an input reference, but splitProjects puts nothing but input references there, so the branch was dead. And a rolled-up column with no parent node dereferenced that parent, where the Table contract has said it may be absent since the method was introduced. The Jackson result classes keep non-null fields under a NullAway.Init suppression, since Druid always populates them; the three that depend on the analysis types the query asked for are @Nullable, which is what the reader of aggregators already assumed. Co-Authored-By: Claude Opus 5 --- build.gradle.kts | 2 +- .../adapter/druid/DruidConnectionImpl.java | 40 +++++---- .../adapter/druid/DruidJsonFilter.java | 46 +++++----- .../calcite/adapter/druid/DruidQuery.java | 86 +++++++++++-------- .../calcite/adapter/druid/DruidRules.java | 30 +++---- .../adapter/druid/DruidSqlCastConverter.java | 4 +- .../calcite/adapter/druid/DruidTable.java | 14 +-- .../adapter/druid/DruidTableFactory.java | 7 +- .../calcite/adapter/druid/DruidType.java | 1 - .../adapter/druid/TimeExtractionFunction.java | 12 +-- .../calcite/adapter/druid/VirtualColumn.java | 19 ++-- .../calcite/adapter/druid/package-info.java | 3 + 12 files changed, 144 insertions(+), 120 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index fe3857ab150e..a5aa3410fa55 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -165,7 +165,7 @@ val werror by props(true) // treat javac warnings as errors // 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") +val nullawayProjects = listOf(":linq4j", ":core", ":server", ":druid") val hepLargePlanModeTestIncludes = mapOf( ":core" to listOf( 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 dedadefd60ab..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 @@ -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/DruidJsonFilter.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidJsonFilter.java index e8ed7c33baae..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 @@ -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 2d89420a13ee..8ac2db4d17af 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 @@ -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); @@ -1525,7 +1538,8 @@ protected static void writeFieldIf(JsonGenerator generator, String fieldName, } } - protected static void writeArray(JsonGenerator generator, List elements) + protected static void writeArray(JsonGenerator generator, + List elements) throws IOException { generator.writeStartArray(); for (Object o : elements) { @@ -1534,7 +1548,7 @@ protected static void writeArray(JsonGenerator generator, List elements) generator.writeEndArray(); } - protected static void writeObject(JsonGenerator generator, Object o) + protected static void writeObject(JsonGenerator generator, @Nullable Object o) throws IOException { if (o instanceof String) { String s = (String) o; @@ -1555,7 +1569,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 +1608,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 +1648,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 +1672,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 814b716c1cf7..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 @@ -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/DruidSqlCastConverter.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidSqlCastConverter.java index 67f725f14d1b..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 @@ -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/DruidTable.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidTable.java index 925cab5d7b85..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 @@ -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 b4174ab1e642..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 @@ -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/TimeExtractionFunction.java b/druid/src/main/java/org/apache/calcite/adapter/druid/TimeExtractionFunction.java index 6d9e6e21a150..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 @@ -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/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; From 34a8e178a6526038281859a233a0d40a55b1e74c Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 20:23:58 +0300 Subject: [PATCH 43/60] [CALCITE-7736] Put :file under nullness verification The file adapter now declares its package @NullMarked, and NullAway verifies it. A CSV cell, a table name in a model, and a field configuration are all absent-able, and the signatures now say so: field() reads a row whose cells may be absent, the row converters carry a nullable element type, and FileSchema falls back to the source path through Util.firstNonNull rather than through the @Contract on Util.first, which NullAway cannot read. Two lazily populated fields were the reason for the remaining reports. FileReader.getTable wrote its result into tableElement and returned nothing, so no caller could see that the field was populated; it is now readTable, which returns the element it read. The bad-source-column check in FileRowConverter looked the heading up twice, once to validate and once to take the index, and now does both at once. A model that names no file for a CSV table, or no url for an HTML table, was already a NullPointerException deeper in; requireNonNull names the missing operand instead. Co-Authored-By: Claude Opus 5 --- build.gradle.kts | 2 +- .../calcite/adapter/file/CsvEnumerator.java | 14 +++++------ .../adapter/file/CsvProjectTableScanRule.java | 3 ++- .../calcite/adapter/file/CsvTableFactory.java | 4 +++- .../calcite/adapter/file/FileEnumerator.java | 4 +++- .../calcite/adapter/file/FileFieldType.java | 2 +- .../calcite/adapter/file/FileReader.java | 23 +++++++++++-------- .../adapter/file/FileRowConverter.java | 15 ++++++------ .../calcite/adapter/file/FileSchema.java | 7 ++++-- .../adapter/file/FileSchemaFactory.java | 8 ++----- .../calcite/adapter/file/FileTable.java | 4 ++-- .../calcite/adapter/file/JsonEnumerator.java | 5 ++-- .../calcite/adapter/file/package-info.java | 3 +++ 13 files changed, 52 insertions(+), 42 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index a5aa3410fa55..33906181ac0c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -165,7 +165,7 @@ val werror by props(true) // treat javac warnings as errors // 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") +val nullawayProjects = listOf(":linq4j", ":core", ":server", ":druid", ":file") val hepLargePlanModeTestIncludes = mapOf( ":core" to listOf( 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 f54e4202da6a..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 @@ -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/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/CsvTableFactory.java b/file/src/main/java/org/apache/calcite/adapter/file/CsvTableFactory.java index 78ada9185ab1..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 @@ -32,6 +32,8 @@ 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/FileEnumerator.java b/file/src/main/java/org/apache/calcite/adapter/file/FileEnumerator.java index 638393326cfa..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 @@ -23,6 +23,8 @@ 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 71caff6057a2..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 @@ -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 632dceac5e08..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 @@ -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 94bb6362f6a7..d8e04e2ea955 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 @@ -72,7 +72,7 @@ class FileRowConverter { /** Creates a FileRowConverter. */ FileRowConverter(FileReader fileReader, - List> fieldConfigs) { + @Nullable List> fieldConfigs) { this.fileReader = fileReader; this.fieldConfigs = fieldConfigs; } @@ -106,14 +106,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 +131,6 @@ private void initialize() { skip = parseBoolean(sSkip); } - Integer sourceIx = headerMap.get(thName); colNames.add(name); sources.add(thName); if (!skip) { @@ -170,7 +169,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]; @@ -262,7 +261,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 ef8616bc1cbd..01aaa80633d7 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 @@ -34,6 +34,8 @@ 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,7 +136,8 @@ 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) { 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 b3a2aba3acff..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 @@ -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 5bae6f3b295b..6dc986ffd72e 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 @@ -84,7 +84,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) { @@ -123,7 +124,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/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; From c307931c5777504f2fc47435c1f53c1df8ec7b03 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 20:30:57 +0300 Subject: [PATCH 44/60] [CALCITE-7736] Put :kafka under nullness verification The model that the adapter's own test uses names neither bootstrap.servers nor topic.name, because a table that injects its own consumer needs neither, so both options are optional and KafkaTableOptions now says so. That reaches KafkaRowConverter.rowDataType, whose topic name is absent for such a table; neither implementation looks at it. The bootstrap servers are required on the path that builds a consumer, and requireNonNull there names the missing operand rather than letting the Kafka client report it. Co-Authored-By: Claude Opus 5 --- build.gradle.kts | 2 +- .../adapter/kafka/KafkaRowConverter.java | 7 +++-- .../adapter/kafka/KafkaRowConverterImpl.java | 4 ++- .../adapter/kafka/KafkaStreamTable.java | 5 +++- .../adapter/kafka/KafkaTableFactory.java | 4 +-- .../adapter/kafka/KafkaTableOptions.java | 30 +++++++++++-------- .../calcite/adapter/kafka/package-info.java | 3 ++ 7 files changed, 36 insertions(+), 19 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 33906181ac0c..9c02836cc33c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -165,7 +165,7 @@ val werror by props(true) // treat javac warnings as errors // 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") +val nullawayProjects = listOf(":linq4j", ":core", ":server", ":druid", ":file", ":kafka") val hepLargePlanModeTestIncludes = mapOf( ":core" to listOf( 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 8a3954b3a532..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 @@ -45,6 +45,8 @@ 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 efeb20aba260..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 @@ -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; From 67d52927f80049b4a28dcea6448244acf782a117 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 20:35:34 +0300 Subject: [PATCH 45/60] [CALCITE-7736] Put :spark under nullness verification SparkValues read the rowType field, which AbstractRelNode keeps as a lazily computed cache, where it meant the row type its constructor was given; getRowType() is the accessor that always has one. EnumerableToSparkConverter throws before it reaches its unfinished body, so the body is gone and the comment that describes what it would generate stays. RexToLixTranslator.translateCondition passes its correlates argument straight to setCorrelates, which has always accepted null, so the parameter says so now. That is what lets SparkCalc convert a program that has no correlates. Co-Authored-By: Claude Opus 5 --- build.gradle.kts | 2 +- .../spark/EnumerableToSparkConverter.java | 30 +------------------ .../calcite/adapter/spark/HttpServer.java | 2 +- .../calcite/adapter/spark/SparkMethod.java | 4 ++- .../calcite/adapter/spark/SparkRules.java | 6 ++-- .../spark/SparkToEnumerableConverter.java | 4 ++- .../calcite/adapter/spark/package-info.java | 3 ++ 7 files changed, 15 insertions(+), 36 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 9c02836cc33c..d1139a33c5b4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -165,7 +165,7 @@ val werror by props(true) // treat javac warnings as errors // 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") +val nullawayProjects = listOf(":linq4j", ":core", ":server", ":druid", ":file", ":kafka", ":spark") val hepLargePlanModeTestIncludes = mapOf( ":core" to listOf( 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 45ce57f684bf..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; @@ -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 d8b3227e8379..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 @@ -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/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 51bab088d1f2..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 @@ -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 edc4b893dcf8..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 @@ -40,6 +40,8 @@ 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; From a3a7f7221be403e1c237ad01a7879f345f90232b Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 20:38:02 +0300 Subject: [PATCH 46/60] [CALCITE-7736] Put :babel under nullness verification The call factory for Babel's CREATE TABLE takes the collection type out of a symbol literal, and SqlLiteral.symbolValue returns null for a literal that holds no symbol. The parser always writes one, so requireNonNull states that rather than leaving the constructor to find out. Co-Authored-By: Claude Opus 5 --- .../org/apache/calcite/sql/babel/SqlBabelCreateTable.java | 4 +++- .../main/java/org/apache/calcite/sql/babel/package-info.java | 3 +++ .../org/apache/calcite/sql/babel/postgres/package-info.java | 3 +++ build.gradle.kts | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) 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 5a4653c2fd83..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 @@ -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]), 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/build.gradle.kts b/build.gradle.kts index d1139a33c5b4..f0f7f5ecd1a3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -165,7 +165,7 @@ val werror by props(true) // treat javac warnings as errors // 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") +val nullawayProjects = listOf(":linq4j", ":core", ":server", ":druid", ":file", ":kafka", ":spark", ":babel") val hepLargePlanModeTestIncludes = mapOf( ":core" to listOf( From 359fc31c1d1f5126449d4bdfab200e35d7bcc27f Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 20:45:38 +0300 Subject: [PATCH 47/60] [CALCITE-7736] Put :redis under nullness verification A Redis schema with no password is the ordinary case, and it reaches the pool config through RedisConfig and RedisJedisManager, both of which say so now. RedisSchema validated its operands through isEmptyObject, whose result NullAway cannot connect back to the value, so the checks name the value they read and read it once. RedisTable had a RedisEnumerator field that nothing ever read. The anonymous Enumerable in RedisTable.scan is now a named inner class. NullAway checks an anonymous class's overrides against the erased supertype, dropping the @Nullable on its type argument, so it reported the enumerator() override as a nullability mismatch; a named subclass with the same type argument is accepted. Co-Authored-By: Claude Opus 5 --- build.gradle.kts | 2 +- .../calcite/adapter/redis/RedisConfig.java | 8 +++--- .../adapter/redis/RedisDataFormat.java | 4 ++- .../adapter/redis/RedisDataProcess.java | 2 +- .../calcite/adapter/redis/RedisDataType.java | 4 ++- .../adapter/redis/RedisEnumerator.java | 11 +++++--- .../adapter/redis/RedisJedisManager.java | 8 +++--- .../calcite/adapter/redis/RedisSchema.java | 26 +++++++++---------- .../adapter/redis/RedisSchemaFactory.java | 9 ++++--- .../calcite/adapter/redis/RedisTable.java | 13 +++++----- .../adapter/redis/RedisTableFactory.java | 5 +++- .../adapter/redis/RedisTableFieldInfo.java | 4 +++ .../calcite/adapter/redis/package-info.java | 3 +++ .../redis/embedded/util/package-info.java | 3 +++ 14 files changed, 63 insertions(+), 39 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index f0f7f5ecd1a3..4087571050f3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -165,7 +165,7 @@ val werror by props(true) // treat javac warnings as errors // 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") +val nullawayProjects = listOf(":linq4j", ":core", ":server", ":druid", ":file", ":kafka", ":spark", ":babel", ":redis") val hepLargePlanModeTestIncludes = mapOf( ":core" to listOf( 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 41038af92f66..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 @@ -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 c5e562f2af5b..8dd89b7f2673 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 @@ -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,8 +104,8 @@ static Table create( } @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { + return new 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 97e5d0938c9c..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 @@ -27,6 +27,8 @@ 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; From b60bf84342d6879f37113705d2792c9f633536fd Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 20:59:17 +0300 Subject: [PATCH 48/60] [CALCITE-7736] Put :splunk under nullness verification The push-down rule builds a search string from whichever of the two projections and the two row types the match happened to have, so those parameters are optional and the signature says so. A literal that is neither numeric nor CHAR yields no search text, which is how getFilter already reads the result. SplunkResultEnumerator reads the CSV header in its constructor, and a header it could not read leaves the field names absent; moveNext now stops instead of dereferencing them. close() swallowed the NullPointerException it raised on a null Closeable, and returns early instead. Co-Authored-By: Claude Opus 5 --- build.gradle.kts | 2 +- .../adapter/splunk/SplunkPushDownRule.java | 18 +++++++++++------- .../adapter/splunk/SplunkTableScan.java | 13 ++++++++----- .../calcite/adapter/splunk/package-info.java | 3 +++ .../splunk/search/SplunkConnectionImpl.java | 15 ++++++++++----- .../adapter/splunk/search/package-info.java | 3 +++ .../adapter/splunk/util/package-info.java | 3 +++ 7 files changed, 39 insertions(+), 18 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4087571050f3..52ed5c562d95 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -165,7 +165,7 @@ val werror by props(true) // treat javac warnings as errors // 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") +val nullawayProjects = listOf(":linq4j", ":core", ":server", ":druid", ":file", ":kafka", ":spark", ":babel", ":redis", ":splunk") val hepLargePlanModeTestIncludes = mapOf( ":core" to listOf( 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/SplunkTableScan.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/SplunkTableScan.java index 996f4fe3c1f2..41dfeb4bcc7d 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(); } 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/SplunkConnectionImpl.java b/splunk/src/main/java/org/apache/calcite/adapter/splunk/search/SplunkConnectionImpl.java index 1ff97d5a36e2..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 @@ -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; From c6b74b98c3a0748db5eb04fcfd1d6823d3954b68 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 21:08:28 +0300 Subject: [PATCH 49/60] [CALCITE-7736] Put :mongodb under nullness verification A MongoDB document has no value for a field it does not carry, so a projection of one field enumerates nulls, and the getter, the enumerator and the enumerable that carry it now say so. That needed the element type of AbstractEnumerable to admit null, which Enumerable and Queryable have admitted all along; the four interfaces between them said otherwise, and now agree. The filter translator builds its documents with JsonBuilder, whose maps and lists hold absent values, and it passes a null operator to mean equality, which translateOp2 has always read that way. The two anonymous Enumerables in MongoTable are named classes, to avoid uber/NullAway#1746. Co-Authored-By: Claude Opus 5 --- build.gradle.kts | 6 +- .../adapter/mongodb/MongoEnumerator.java | 24 +++---- .../calcite/adapter/mongodb/MongoFilter.java | 66 ++++++++++--------- .../calcite/adapter/mongodb/MongoProject.java | 4 +- .../calcite/adapter/mongodb/MongoRules.java | 5 +- .../adapter/mongodb/MongoSchemaFactory.java | 6 +- .../calcite/adapter/mongodb/MongoSort.java | 10 ++- .../calcite/adapter/mongodb/MongoTable.java | 35 ++++++---- .../mongodb/MongoToEnumerableConverter.java | 10 ++- .../calcite/adapter/mongodb/package-info.java | 3 + 10 files changed, 101 insertions(+), 68 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 52ed5c562d95..989c6ba941cb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -165,7 +165,7 @@ val werror by props(true) // treat javac warnings as errors // 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") +val nullawayProjects = listOf(":linq4j", ":core", ":server", ":druid", ":file", ":kafka", ":spark", ":babel", ":redis", ":splunk", ":mongodb", ":cassandra", ":pig", ":arrow", ":innodb", ":piglet", ":geode", ":elasticsearch", ":plus", ":example:csv", ":example:function", ":testkit", ":ubenchmark") val hepLargePlanModeTestIncludes = mapOf( ":core" to listOf( @@ -873,7 +873,9 @@ allprojects { } val nullawayEnabled = project.path in nullawayProjects tasks.withType().configureEach { - val mainCode = name == "compileJava" + // :ubenchmark keeps its sources in the jmh source set, and they are + // the module's own code just as much as a main source set is + val mainCode = name == "compileJava" || name == "compileJmhJava" // NullAway reports every error it finds, and javac hides all but the first 100 options.compilerArgs.addAll(listOf("-Xmaxerrs", "10000")) options.errorprone { 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 b8de7e0597b4..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 @@ -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 ad1330c02246..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 @@ -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 79f060b006a1..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 @@ -37,6 +37,8 @@ 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/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 45d7d7e2cc03..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 @@ -35,13 +35,16 @@ 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..380dd2ec93d6 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,17 +100,19 @@ 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() { + final Function1 getter = + MongoEnumerator.getter(fields); + return new AbstractEnumerable<@Nullable Object>() { + @Override public Enumerator<@Nullable Object> enumerator() { @SuppressWarnings("unchecked") final FindIterable cursor = collection.find(filter).projection(project); return new MongoEnumerator(cursor.iterator(), getter); @@ -128,17 +133,17 @@ 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() { + return new AbstractEnumerable<@Nullable Object>() { + @Override public Enumerator<@Nullable Object> enumerator() { final Iterator resultIterator; try { resultIterator = mongoDb.getCollection(collectionName) @@ -170,7 +175,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 +187,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 +203,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/MongoToEnumerableConverter.java b/mongodb/src/main/java/org/apache/calcite/adapter/mongodb/MongoToEnumerableConverter.java index daa0faf8fd03..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 @@ -45,6 +45,8 @@ 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; From b01f2ce85d970a9cd77f20ae336a3fc00122dee5 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 21:11:00 +0300 Subject: [PATCH 50/60] [CALCITE-7736] Put :cassandra under nullness verification A Cassandra row has no value for a column it never set, so the enumerator and the enumerable that carries it enumerate nulls. The tuple components a STRUCT holds are already collected through requireNonNull, which is where the comment saying null cannot appear inside a collection lives. The enumerable is a named class rather than an anonymous one, to avoid uber/NullAway#1746. Co-Authored-By: Claude Opus 5 --- .../adapter/cassandra/CassandraEnumerator.java | 8 ++++---- .../cassandra/CassandraSchemaFactory.java | 3 ++- .../adapter/cassandra/CassandraTable.java | 16 +++++++++------- .../calcite/adapter/cassandra/package-info.java | 3 +++ 4 files changed, 18 insertions(+), 12 deletions(-) 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 f24ccd973a3c..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 @@ -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/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/CassandraTable.java b/cassandra/src/main/java/org/apache/calcite/adapter/cassandra/CassandraTable.java index bba5bdad07fe..d34ef52b1a8f 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 @@ -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,12 +219,13 @@ public Enumerable query(final CqlSession session, List() { - @Override public Enumerator enumerator() { + return new AbstractEnumerable<@Nullable Object>() { + @Override public Enumerator<@Nullable Object> enumerator() { final ResultSet results = session.execute(queryBuilder.toString()); // Skip results until we get to the right offset int skip = 0; - Enumerator enumerator = new CassandraEnumerator(results, resultRowType); + Enumerator<@Nullable Object> enumerator = + new CassandraEnumerator(results, resultRowType); while (skip < offset && enumerator.moveNext()) { skip++; } @@ -275,7 +277,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/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; From b657086f6e030bb6b187f70bc716b3acd1c37bf9 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 21:12:36 +0300 Subject: [PATCH 51/60] [CALCITE-7736] Put :pig under nullness verification The Pig rel nodes look down the tree for the table they act on, and a tree with no table underneath returns none, which is what RelNode.getTable has always said. PigToEnumerableConverter read the rowType field, AbstractRelNode's lazily computed cache, where it meant this node's row type. A model that names no file or no columns for a Pig table reached the File and the array with a null; requireNonNull names the missing operand. Co-Authored-By: Claude Opus 5 --- .../org/apache/calcite/adapter/pig/PigAggregate.java | 10 ++++++---- .../java/org/apache/calcite/adapter/pig/PigFilter.java | 4 +++- .../java/org/apache/calcite/adapter/pig/PigJoin.java | 4 +++- .../org/apache/calcite/adapter/pig/PigProject.java | 4 +++- .../java/org/apache/calcite/adapter/pig/PigRel.java | 5 ++++- .../apache/calcite/adapter/pig/PigTableFactory.java | 10 +++++++--- .../calcite/adapter/pig/PigToEnumerableConverter.java | 2 +- .../org/apache/calcite/adapter/pig/package-info.java | 3 +++ 8 files changed, 30 insertions(+), 12 deletions(-) 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 78544bbe49f4..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 @@ -27,6 +27,8 @@ 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; From 6b36f5b7d07640c9a2549b5908c03cdee1f65417 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 21:14:03 +0300 Subject: [PATCH 52/60] [CALCITE-7736] Put :arrow under nullness verification An Arrow vector holds a null wherever the column has no value, which getValue returns for a timestamp and the enumerator hands on, so the enumerator, the enumerable and the query that builds it carry a nullable element type. The precondition on query's field list is one the ImmutableIntList parameter already makes. Co-Authored-By: Claude Opus 5 --- .../calcite/adapter/arrow/AbstractArrowEnumerator.java | 10 ++++++---- .../apache/calcite/adapter/arrow/ArrowEnumerable.java | 6 ++++-- .../org/apache/calcite/adapter/arrow/ArrowTable.java | 9 +++------ .../org/apache/calcite/adapter/arrow/package-info.java | 3 +++ 4 files changed, 16 insertions(+), 12 deletions(-) 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/ArrowTable.java b/arrow/src/main/java/org/apache/calcite/adapter/arrow/ArrowTable.java index 95ee7867a5b4..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 @@ -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/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; From 26862be77f03d4e9796c7bb2e1b58cea22ed3785 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 21:15:27 +0300 Subject: [PATCH 53/60] [CALCITE-7736] Put :innodb under nullness verification An InnoDB row has no value for a column that holds none, which the enumerator returns and the row array carries. The implementor and the internal expression node are filled in as the translation proceeds, so their fields are marked NullAway.Init rather than pretending a half-built object never exists. A model that names no sql file or no data file path reached the schema with a null; requireNonNull names the missing operand. Co-Authored-By: Claude Opus 5 --- .../adapter/innodb/InnodbEnumerator.java | 6 +- .../innodb/InnodbFilterTranslator.java | 6 +- .../calcite/adapter/innodb/InnodbRel.java | 4 + .../adapter/innodb/InnodbSchemaFactory.java | 9 ++- .../calcite/adapter/innodb/InnodbSort.java | 3 +- .../calcite/adapter/innodb/InnodbTable.java | 74 ++++++++++--------- .../calcite/adapter/innodb/package-info.java | 3 + 7 files changed, 62 insertions(+), 43 deletions(-) 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 2d27d9a474d5..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 @@ -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/InnodbFilterTranslator.java b/innodb/src/main/java/org/apache/calcite/adapter/innodb/InnodbFilterTranslator.java index 59e5332dfaa0..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 @@ -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/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 f3a01c2d1bdb..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 @@ -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..82ab6f06ca87 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,8 +175,8 @@ public Enumerable query( TableReader tableReader = tableReaderFactory.createTableReader(tableName); tableReader.open(); - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { + return new AbstractEnumerable<@Nullable Object>() { + @Override public Enumerator<@Nullable Object> enumerator() { Iterator resultIterator; LOGGER.debug("Create query iterator, queryType={}, indexName={}, " + "pointQueryKey={}, projection={}, rangeQueryKey={}{} AND {}{}, " @@ -183,36 +184,36 @@ public Enumerable query( 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"); + 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); @@ -273,11 +274,12 @@ 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); } } + } 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; From 8568d53b7d706495d5d1fd6a0e3b575d40bd8d96 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 21:25:16 +0300 Subject: [PATCH 54/60] [CALCITE-7736] Put :piglet under nullness verification Piglet keeps four maps from a relation to its alias and its Pig operator, and looking a name up in them can miss, which the getters now say. Handler looked its relations up the same way and pushed whatever came back, including nothing; it now reports the unknown name instead of failing later in the builder. PigTable.scan returned null rather than an enumerable, and nothing could have used it; it throws. SqlUserDefinedFunction declared its operand type inference non-null though SqlFunction below it has always accepted none, which is what PigUserDefinedFunction passes. Co-Authored-By: Claude Opus 5 --- .../piglet/DynamicTupleRecordType.java | 7 ++-- .../org/apache/calcite/piglet/Handler.java | 32 +++++++++++++------ .../apache/calcite/piglet/PigRelBuilder.java | 32 ++++++++++++------- .../calcite/piglet/PigRelExVisitor.java | 13 +++++--- .../calcite/piglet/PigRelOpInnerVisitor.java | 6 ++-- .../calcite/piglet/PigRelOpVisitor.java | 23 +++++++++---- .../apache/calcite/piglet/PigRelOpWalker.java | 5 ++- .../apache/calcite/piglet/PigRelSqlUdfs.java | 25 +++++++++++---- .../calcite/piglet/PigRelUdfConverter.java | 4 ++- .../org/apache/calcite/piglet/PigTable.java | 2 +- .../calcite/piglet/PigToSqlAggregateRule.java | 15 ++++++--- .../apache/calcite/piglet/PigUdfFinder.java | 6 ++-- .../piglet/PigUserDefinedFunction.java | 10 +++--- .../apache/calcite/piglet/package-info.java | 3 ++ 14 files changed, 126 insertions(+), 57 deletions(-) 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 d57fe4acf2a7..9c3648e67878 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/PigTable.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/PigTable.java @@ -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 cf3d46b752de..ff1787cdd2c8 100644 --- a/piglet/src/main/java/org/apache/calcite/piglet/PigToSqlAggregateRule.java +++ b/piglet/src/main/java/org/apache/calcite/piglet/PigToSqlAggregateRule.java @@ -46,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. @@ -127,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; @@ -269,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)) { @@ -290,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)); } } @@ -403,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; From 4a33a25882245f6a270ffe7bb529611c3696026d Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 21:41:52 +0300 Subject: [PATCH 55/60] [CALCITE-7736] Put :geode under nullness verification A Geode entry has no value for a field it does not carry, which the converters return and the enumerator hands on. The two schema factories read four operands out of the model and passed them on unchecked; requireNonNull names whichever one is missing. The lazily built table maps and the limit an implement context may not have say so. Region's value type is a bytecode wildcard whose upper bound reads as nullable, so the value constraint cannot be held in a Class; a raw Class avoids it. See uber/NullAway#1732. Co-Authored-By: Claude Opus 5 --- .../adapter/geode/rel/GeodeAggregate.java | 9 ++-- .../adapter/geode/rel/GeodeEnumerator.java | 2 +- .../adapter/geode/rel/GeodeFilter.java | 4 +- .../calcite/adapter/geode/rel/GeodeRel.java | 8 +++- .../adapter/geode/rel/GeodeSchema.java | 4 +- .../adapter/geode/rel/GeodeSchemaFactory.java | 17 +++++-- .../calcite/adapter/geode/rel/GeodeSort.java | 3 +- .../calcite/adapter/geode/rel/GeodeTable.java | 47 ++++++++++++------- .../adapter/geode/rel/package-info.java | 3 ++ .../geode/simple/GeodeSimpleEnumerator.java | 9 ++-- .../geode/simple/GeodeSimpleSchema.java | 4 +- .../simple/GeodeSimpleSchemaFactory.java | 17 +++++-- .../adapter/geode/simple/package-info.java | 3 ++ .../adapter/geode/util/GeodeUtils.java | 23 +++++---- .../adapter/geode/util/package-info.java | 3 ++ 15 files changed, 108 insertions(+), 48 deletions(-) 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 0b9041087618..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 @@ -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 93e28a3013c6..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 @@ -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 b1cf8f5ac6b2..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 @@ -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/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/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 fa150e978a26..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 @@ -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 83075a7db007..21ee2842e68c 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 @@ -66,7 +66,7 @@ public class GeodeTable extends AbstractQueryableTable implements TranslatableTa private final String regionName; private final RelDataType rowType; - GeodeTable(Region region) { + GeodeTable(Region region) { super(Object[].class); this.regionName = region.getName(); this.rowType = GeodeUtils.autodetectRelTypeFromRegion(region); @@ -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/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 341edf72b72e..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 @@ -26,16 +26,19 @@ 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/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 b9066de66b7a..084585f4f60a 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 @@ -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; } @@ -289,11 +289,13 @@ private static Object convert(Object o, Class clazz) { * @param region existing region * @return derived data type. */ - public static RelDataType autodetectRelTypeFromRegion(Region region) { + 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(); + final @Nullable Class constraint = + region.getAttributes().getValueConstraint(); if (constraint != null && !PdxInstance.class.isAssignableFrom(constraint)) { return new JavaTypeFactoryExtImpl().createStructType(constraint); } @@ -313,7 +315,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; From 9396d74d6212256b4e3fb05a4be039165aeb9732 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 21:53:37 +0300 Subject: [PATCH 56/60] [CALCITE-7736] Put :elasticsearch under nullness verification An Elasticsearch hit carries either _source or fields and never both, so each of the two is absent half the time, and a document has no value for a field it does not carry. That runs through the getters, the row converters and the aggregation buckets, whose key is absent for a missing bucket. The predicate analyzer reads a literal that may hold no value: a range bound needs one and says so, while a term query writes whatever it got. A LIKE with no escape, a projection that is not an item reference, and an expression the analyzer cannot convert are all absent results the callers already handled. The schema factory takes the credentials and the path prefix from the model, where they are optional. Co-Authored-By: Claude Opus 5 --- .../elasticsearch/ElasticsearchAggregate.java | 9 +-- .../ElasticsearchEnumerators.java | 20 +++--- .../elasticsearch/ElasticsearchFilter.java | 8 ++- .../elasticsearch/ElasticsearchJson.java | 65 +++++++++---------- .../elasticsearch/ElasticsearchMapping.java | 2 +- .../elasticsearch/ElasticsearchRel.java | 11 +++- .../ElasticsearchSchemaFactory.java | 9 ++- .../ElasticsearchSearchResult.java | 4 +- .../elasticsearch/ElasticsearchTable.java | 12 ++-- .../MapProjectionFieldVisitor.java | 6 +- .../elasticsearch/PredicateAnalyzer.java | 54 ++++++++------- .../adapter/elasticsearch/QueryBuilders.java | 34 +++++----- .../adapter/elasticsearch/Scrolling.java | 6 +- .../adapter/elasticsearch/package-info.java | 3 + 14 files changed, 140 insertions(+), 103 deletions(-) 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 28d2783735ac..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 @@ -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 123024980279..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 @@ -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 10d8e83bce22..cffc94ce62eb 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 @@ -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 9a0baac8c5ec..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 @@ -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/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/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/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/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; From 970698e14d8e0eed5c3e1d36c69592ceeb2942af Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 22:00:30 +0300 Subject: [PATCH 57/60] [CALCITE-7736] Put :plus under nullness verification An os table function returns a row whose columns are absent wherever the command printed nothing, which the enumerators and the line parsers now carry. Ten of them built the same anonymous enumerable over an osquery table; they share OsQueryEnumerable instead, which also avoids uber/NullAway#1746, as do the named enumerator in the stdin function and the named line parser in vmstat. os.name is absent on a JVM that does not publish it, and the table functions switch on it. SqlShell prints a column that has no value, and looks a column label up in a map that may not hold it. The Avatica server for Chinook holds its server and its meta instance from the point it starts them. Co-Authored-By: Claude Opus 5 --- .../adapter/os/CpuInfoTableFunction.java | 4 ++-- .../adapter/os/CpuTimeTableFunction.java | 4 ++-- .../adapter/os/FilesTableFunction.java | 5 +++-- .../os/InterfaceAddressesTableFunction.java | 4 ++-- .../os/InterfaceDetailsTableFunction.java | 4 ++-- .../adapter/os/JavaInfoTableFunction.java | 4 ++-- .../adapter/os/MemoryInfoTableFunction.java | 4 ++-- .../adapter/os/MountsTableFunction.java | 4 ++-- .../apache/calcite/adapter/os/OsQuery.java | 9 ++++---- .../adapter/os/OsVersionTableFunction.java | 4 ++-- .../apache/calcite/adapter/os/Processes.java | 10 +++++---- .../calcite/adapter/os/PsTableFunction.java | 21 +++++++++++-------- .../apache/calcite/adapter/os/SqlShell.java | 11 ++++++---- .../adapter/os/StdinTableFunction.java | 8 +++---- .../adapter/os/SystemInfoTableFunction.java | 4 ++-- .../adapter/os/VmstatTableFunction.java | 15 +++++++------ .../calcite/adapter/os/package-info.java | 3 +++ .../calcite/adapter/tpcds/TpcdsSchema.java | 6 +++--- .../calcite/adapter/tpcds/package-info.java | 3 +++ .../calcite/adapter/tpch/package-info.java | 3 +++ .../calcite/adapter/utils/package-info.java | 3 +++ .../calcite/chinook/ChinookAvaticaServer.java | 8 +++++-- .../apache/calcite/chinook/package-info.java | 3 +++ .../calcite/adapter/tpcds/TpcdsTest.java | 3 +-- 24 files changed, 89 insertions(+), 58 deletions(-) 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 e92c3feb51b5..4dba8657df6e 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 @@ -37,8 +37,8 @@ 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 AbstractEnumerable<@Nullable Object[]>() { + @Override public Enumerator<@Nullable Object[]> enumerator() { return new OsQuery("cpu_info"); } }; 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 a303143ce367..de6da4eb0c16 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 @@ -37,8 +37,8 @@ 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 AbstractEnumerable<@Nullable Object[]>() { + @Override public Enumerator<@Nullable Object[]> enumerator() { return new OsQuery("cpu_time"); } }; 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 6e8162f730ee..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 @@ -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/InterfaceAddressesTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/InterfaceAddressesTableFunction.java index 30cb54c66f84..3eca36c8c484 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 @@ -37,8 +37,8 @@ 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 AbstractEnumerable<@Nullable Object[]>() { + @Override public Enumerator<@Nullable Object[]> enumerator() { return new OsQuery("interface_addresses"); } }; 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 9b2964bc6471..502f7669e275 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 @@ -37,8 +37,8 @@ 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 AbstractEnumerable<@Nullable Object[]>() { + @Override public Enumerator<@Nullable Object[]> enumerator() { return new OsQuery("interface_details"); } }; 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 75f52a77aa65..69b7ab05769c 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 @@ -37,8 +37,8 @@ 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 AbstractEnumerable<@Nullable Object[]>() { + @Override public Enumerator<@Nullable Object[]> enumerator() { return new OsQuery("java_info"); } }; 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 d1c4d66b5348..898cc6498202 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 @@ -37,8 +37,8 @@ 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 AbstractEnumerable<@Nullable Object[]>() { + @Override public Enumerator<@Nullable Object[]> enumerator() { return new OsQuery("memory_info"); } }; 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 3f488f623441..a7efed625956 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 @@ -37,8 +37,8 @@ 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 AbstractEnumerable<@Nullable Object[]>() { + @Override public Enumerator<@Nullable Object[]> enumerator() { return new OsQuery("mounts"); } }; 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/plus/src/main/java/org/apache/calcite/adapter/os/OsVersionTableFunction.java b/plus/src/main/java/org/apache/calcite/adapter/os/OsVersionTableFunction.java index 0c78bbb341d6..1fdfa38a6854 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 @@ -37,8 +37,8 @@ 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 AbstractEnumerable<@Nullable Object[]>() { + @Override public Enumerator<@Nullable Object[]> enumerator() { return new OsQuery("os_version"); } }; 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 2337bbf27c2e..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 @@ -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 53e7424ecf1b..96275ee64383 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 @@ -46,17 +46,17 @@ 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() { + return new AbstractEnumerable<@Nullable Object[]>() { final InputStreamReader in = new InputStreamReader(is, StandardCharsets.UTF_8); final BufferedReader br = new BufferedReader(in); - @Override public Enumerator enumerator() { - return new Enumerator() { + @Override public Enumerator<@Nullable Object[]> enumerator() { + return new Enumerator<@Nullable Object[]>() { @Nullable String line; int i; - @Override public Object[] current() { + @Override public @Nullable Object[] current() { if (line == null) { throw new NoSuchElementException(); } 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 f01aedb127d0..abbd45770f69 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 @@ -37,8 +37,8 @@ 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 AbstractEnumerable<@Nullable Object[]>() { + @Override public Enumerator<@Nullable Object[]> enumerator() { return new OsQuery("system_info"); } }; 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 87eb474df478..7b59df1519a4 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 @@ -32,6 +32,7 @@ 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. @@ -64,11 +66,11 @@ public static ScannableTable eval(boolean b) { args = new String[]{"/bin/sh", "-c", "vmstat -n | tail -n +3"}; } return Processes.processLines(args) - .select( - new Function1() { - @Override public Object[] apply(String line) { + .<@Nullable Object[]>select( + new Function1() { + @Override public @Nullable Object[] apply(String line) { final String[] fields = line.trim().split("\\s+"); - final Object[] values = new Object[fieldNames.size()]; + 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]); @@ -95,7 +97,8 @@ private Object field(@SuppressWarnings("unused") String field, String value) { } @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": 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 153e8da71124..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 @@ -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/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 54654907811e..560b8827e0b6 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,6 @@ import net.hydromatic.tpcds.query.Query; -import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -303,7 +302,7 @@ private CalciteAssert.AssertQuery checkQuery(int i) { } public Frameworks.ConfigBuilder config() throws Exception { - final Holder<@Nullable SchemaPlus> root = Holder.empty(); + final Holder root = Holder.empty(); CalciteAssert.model(TPCDS_MODEL) .doWithConnection(connection -> { root.set(connection.getRootSchema().subSchemas().get("TPCDS")); From ba6a7cbcdaaffee613373540f04da136012eab1a Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Tue, 25 Aug 2026 22:10:27 +0300 Subject: [PATCH 58/60] [CALCITE-7736] Put :example:csv and :example:function under nullness verification A model that names no directory for a CSV schema, and no file for a CSV table, reached the File with a null; requireNonNull names the missing operand. The filterable table pushed down a literal that may hold no value. The maze enumerates without a solution set when the table is asked for the maze alone, which is what the null argument means. Co-Authored-By: Claude Opus 5 --- .../org/apache/calcite/adapter/csv/CsvFilterableTable.java | 6 +++++- .../apache/calcite/adapter/csv/CsvProjectTableScanRule.java | 2 +- .../org/apache/calcite/adapter/csv/CsvSchemaFactory.java | 5 ++++- .../apache/calcite/adapter/csv/CsvStreamTableFactory.java | 4 +++- .../org/apache/calcite/adapter/csv/CsvTableFactory.java | 4 +++- .../java/org/apache/calcite/adapter/csv/package-info.java | 3 +++ .../src/main/java/org/apache/calcite/example/maze/Maze.java | 4 +++- .../java/org/apache/calcite/example/maze/MazeTable.java | 2 +- .../java/org/apache/calcite/example/maze/package-info.java | 3 +++ 9 files changed, 26 insertions(+), 7 deletions(-) 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 e8be1b736538..16d6307f1df9 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 @@ -38,6 +38,8 @@ import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import static java.util.Objects.requireNonNull; + /** * Table based on a CSV file that can implement simple filtering. * @@ -103,7 +105,9 @@ private static boolean addFilter(RexNode filter, @Nullable Object[] filterValues && right instanceof RexLiteral) { final int index = ((RexInputRef) left).getIndex(); if (filterValues[index] == null) { - filterValues[index] = ((RexLiteral) right).getValue2().toString(); + filterValues[index] = + requireNonNull(((RexLiteral) right).getValue2(), "value") + .toString(); return true; } } 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 a3fa3932966a..ce91fed60dd3 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 @@ -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); - int @Nullable [] fields = getProjectFields(project.getProjects()); + int [] 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/CsvSchemaFactory.java b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchemaFactory.java index 79b96af9cc9b..a7f0bf940765 100644 --- a/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchemaFactory.java +++ b/example/csv/src/main/java/org/apache/calcite/adapter/csv/CsvSchemaFactory.java @@ -25,6 +25,8 @@ import java.util.Locale; import java.util.Map; +import static java.util.Objects.requireNonNull; + /** * Factory that creates a {@link CsvSchema}. * @@ -41,7 +43,8 @@ private CsvSchemaFactory() { @Override public Schema create(SchemaPlus parentSchema, String name, Map operand) { - final String directory = (String) operand.get("directory"); + final String directory = + requireNonNull((String) operand.get("directory"), "directory"); final File base = (File) operand.get(ModelHandler.ExtraOperand.BASE_DIRECTORY.camelName); File directoryFile = new File(directory); 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 615f91f20c3f..1f5715ea324d 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 @@ -30,6 +30,8 @@ import java.io.File; import java.util.Map; +import static java.util.Objects.requireNonNull; + /** * Factory that creates a {@link CsvTranslatableTable}. * @@ -44,7 +46,7 @@ public CsvStreamTableFactory() { @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"); File file = new File(fileName); final File base = (File) operand.get(ModelHandler.ExtraOperand.BASE_DIRECTORY.camelName); 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 d7efbe97e392..668829589e11 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 @@ -30,6 +30,8 @@ import java.io.File; import java.util.Map; +import static java.util.Objects.requireNonNull; + /** * Factory that creates a {@link CsvTranslatableTable}. * @@ -44,7 +46,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/example/csv/src/main/java/org/apache/calcite/adapter/csv/package-info.java b/example/csv/src/main/java/org/apache/calcite/adapter/csv/package-info.java index 5cb4d328b692..183c00978e91 100644 --- a/example/csv/src/main/java/org/apache/calcite/adapter/csv/package-info.java +++ b/example/csv/src/main/java/org/apache/calcite/adapter/csv/package-info.java @@ -22,4 +22,7 @@ * directory appears as a table. Full SQL operations are available on * those tables. */ +@NullMarked package org.apache.calcite.adapter.csv; + +import org.jspecify.annotations.NullMarked; diff --git a/example/function/src/main/java/org/apache/calcite/example/maze/Maze.java b/example/function/src/main/java/org/apache/calcite/example/maze/Maze.java index 08dcff8311a2..f37060c6771e 100644 --- a/example/function/src/main/java/org/apache/calcite/example/maze/Maze.java +++ b/example/function/src/main/java/org/apache/calcite/example/maze/Maze.java @@ -18,6 +18,8 @@ import org.apache.calcite.linq4j.Enumerator; +import org.jspecify.annotations.Nullable; + import java.io.PrintWriter; import java.util.ArrayDeque; import java.util.ArrayList; @@ -102,7 +104,7 @@ public void print(PrintWriter pw, boolean space) { } /** Generates a list of lines representing the maze in text form. */ - public Enumerator enumerator(final Set solutionSet) { + public Enumerator enumerator(final @Nullable Set solutionSet) { final CellContent cellContent; if (solutionSet == null) { cellContent = CellContent.SPACE; 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 d715666ea88d..8cee3529584e 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 @@ -107,7 +107,7 @@ private class MazeTableEnumerable extends AbstractEnumerable<@Nullable Object[]> } @Override public Enumerator<@Nullable Object[]> enumerator() { - final Set solutionSet; + final @Nullable Set solutionSet; if (solution) { solutionSet = maze.solve(0, 0); } else { diff --git a/example/function/src/main/java/org/apache/calcite/example/maze/package-info.java b/example/function/src/main/java/org/apache/calcite/example/maze/package-info.java index baebf64a9c83..67d48ddfe10b 100644 --- a/example/function/src/main/java/org/apache/calcite/example/maze/package-info.java +++ b/example/function/src/main/java/org/apache/calcite/example/maze/package-info.java @@ -18,4 +18,7 @@ /** * User-defined table function that generates a maze. */ +@NullMarked package org.apache.calcite.example.maze; + +import org.jspecify.annotations.NullMarked; From 18e873d8f21e394bc73984340a7b6855c96e7edf Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Wed, 26 Aug 2026 08:44:27 +0300 Subject: [PATCH 59/60] [CALCITE-7736] Put :testkit under nullness verification The test fixtures carry absent values everywhere a SQL value can be null: the expected result of checkScalar and checkString, the column a result set reads, the origins and unique keys the metadata query may not know, and the alias a Pig relation may not have. The mock catalog and the mock planner fill their fields in as registration proceeds, so those are marked NullAway.Init. Twelve classes took the @Nullable argument that Object.equals has always allowed. DiffRepository reads a DOM, where a node list yields no node past its length and an attribute may carry no value; the reads that cannot miss say so by name. The eight schemata packages that had no package-info.java now have one. BaseQueryable in :linq4j required a provider, though Smalls builds one that overrides enumerator() and never asks a provider to execute it; getProvider still refuses to return null. Four anonymous enumerables became named classes, to avoid uber/NullAway#1746. Co-Authored-By: Claude Opus 5 --- .../calcite/sql/parser/SqlParserTest.java | 29 ++- .../calcite/sql/parser/package-info.java | 3 + .../calcite/sql/test/AbstractSqlTester.java | 3 +- .../calcite/sql/test/ResultCheckers.java | 16 +- .../calcite/sql/test/SqlOperatorFixture.java | 7 +- .../org/apache/calcite/sql/test/SqlTests.java | 27 ++- .../apache/calcite/sql/test/package-info.java | 3 + .../apache/calcite/test/CalciteAssert.java | 45 ++-- .../calcite/test/ConnectionFactories.java | 7 +- .../apache/calcite/test/DiffRepository.java | 43 ++-- .../org/apache/calcite/test/Matchers.java | 5 +- .../calcite/test/MockRelOptPlanner.java | 10 +- .../calcite/test/MockSqlOperatorTable.java | 11 +- .../org/apache/calcite/test/QuidemTest.java | 45 ++-- .../calcite/test/RelMetadataFixture.java | 19 +- .../apache/calcite/test/RelOptFixture.java | 5 +- .../org/apache/calcite/test/RelSupplier.java | 6 +- .../calcite/test/SqlOperatorFixtureImpl.java | 2 +- .../apache/calcite/test/SqlOperatorTest.java | 14 +- .../apache/calcite/test/SqlToRelTestBase.java | 5 +- .../calcite/test/SqlValidatorFixture.java | 8 +- .../test/catalog/MockCatalogReader.java | 48 ++-- .../test/catalog/MockCatalogReaderSimple.java | 3 +- .../calcite/test/catalog/package-info.java | 3 + .../org/apache/calcite/test/package-info.java | 3 + .../test/schemata/bookstore/package-info.java | 24 ++ .../schemata/catchall/CatchallSchema.java | 6 +- .../test/schemata/catchall/package-info.java | 24 ++ .../test/schemata/countries/package-info.java | 24 ++ .../schemata/foodmart/FoodmartSchema.java | 2 +- .../test/schemata/foodmart/package-info.java | 24 ++ .../calcite/test/schemata/hr/Department.java | 2 +- .../calcite/test/schemata/hr/Dependent.java | 4 +- .../calcite/test/schemata/hr/Employee.java | 2 +- .../calcite/test/schemata/hr/Event.java | 2 +- .../test/schemata/hr/HierarchySchema.java | 4 +- .../calcite/test/schemata/hr/Location.java | 4 +- .../test/schemata/hr/NullableTest.java | 2 +- .../test/schemata/hr/package-info.java | 24 ++ .../test/schemata/lingual/LingualEmp.java | 4 +- .../test/schemata/lingual/package-info.java | 24 ++ .../orderstream/InfiniteOrdersTable.java | 40 ++-- .../orderstream/OrdersHistoryTable.java | 6 +- .../orderstream/OrdersStreamTableFactory.java | 8 +- .../schemata/orderstream/OrdersTable.java | 6 +- .../schemata/orderstream/ProductsTable.java | 6 +- .../schemata/orderstream/package-info.java | 24 ++ .../test/schemata/tpch/package-info.java | 24 ++ .../java/org/apache/calcite/util/Smalls.java | 210 ++++++++++-------- .../org/apache/calcite/util/TestUtil.java | 28 +-- .../org/apache/calcite/util/package-info.java | 3 + 51 files changed, 614 insertions(+), 287 deletions(-) create mode 100644 testkit/src/main/java/org/apache/calcite/test/schemata/bookstore/package-info.java create mode 100644 testkit/src/main/java/org/apache/calcite/test/schemata/catchall/package-info.java create mode 100644 testkit/src/main/java/org/apache/calcite/test/schemata/countries/package-info.java create mode 100644 testkit/src/main/java/org/apache/calcite/test/schemata/foodmart/package-info.java create mode 100644 testkit/src/main/java/org/apache/calcite/test/schemata/hr/package-info.java create mode 100644 testkit/src/main/java/org/apache/calcite/test/schemata/lingual/package-info.java create mode 100644 testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/package-info.java create mode 100644 testkit/src/main/java/org/apache/calcite/test/schemata/tpch/package-info.java 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 356f5fd22771..29353551390d 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 @@ -6920,7 +6920,7 @@ private static Matcher isCharLiteral(String s) { } }); assertNotSame(sqlNodeVisited, sqlNode); - assertThat(sqlNodeVisited.getKind(), is(SqlKind.INSERT)); + assertThat(requireNonNull(sqlNodeVisited, "sqlNodeVisited").getKind(), is(SqlKind.INSERT)); } @Test void testSqlInsertSqlBasicCallToString() { @@ -6935,7 +6935,8 @@ private static Matcher isCharLiteral(String s) { final String str0 = "INSERT INTO `EMPS`\n" + "SELECT *\n" + "FROM `EMPS`"; - assertThat(str0, is(toLinux(sqlNodeVisited0.toString()))); + assertThat(str0, + is(toLinux(requireNonNull(sqlNodeVisited0, "sqlNodeVisited0").toString()))); final String sql1 = "insert into emps select empno from emps"; final SqlNode sqlNode1 = sql(sql1).node(); @@ -6948,7 +6949,8 @@ private static Matcher isCharLiteral(String s) { final String str1 = "INSERT INTO `EMPS`\n" + "SELECT `EMPNO`\n" + "FROM `EMPS`"; - assertThat(str1, is(toLinux(sqlNodeVisited1.toString()))); + assertThat(str1, + is(toLinux(requireNonNull(sqlNodeVisited1, "sqlNodeVisited1").toString()))); } @Test void testVisitSqlUpdateWithSqlShuttle() { @@ -6961,7 +6963,7 @@ private static Matcher isCharLiteral(String s) { } }); assertNotSame(sqlNodeVisited, sqlNode); - assertThat(sqlNodeVisited.getKind(), is(SqlKind.UPDATE)); + assertThat(requireNonNull(sqlNodeVisited, "sqlNodeVisited").getKind(), is(SqlKind.UPDATE)); final String str1 = "UPDATE `EMPS` AS `E` SET `E`.`SAL` = 0\n" + "WHERE `E`.`SAL` < 0"; assertThat(str1, is(toLinux(sqlNodeVisited.toString()))); @@ -8310,7 +8312,8 @@ private static Consumer> checkWarnings( SqlPrettyWriter writer = new SqlPrettyWriter(); assertThat(writer.format(opt.name()), equalTo("\"SCHEMA\"")); writer = new SqlPrettyWriter(); - assertThat(writer.format(opt.getValue()), equalTo("TRUE")); + assertThat(writer.format(requireNonNull(opt.getValue(), "value")), + equalTo("TRUE")); writer = new SqlPrettyWriter(); assertThat(writer.format(opt), equalTo("ALTER SYSTEM SET \"SCHEMA\" = TRUE")); @@ -8521,7 +8524,8 @@ private static Consumer> checkWarnings( return argHandler.result(); } }); - assertThat(toLinux(shuttled.toString()), is(expected)); + assertThat(toLinux(requireNonNull(shuttled, "shuttled").toString()), + is(expected)); } @Test void testMatchRecognize1() { @@ -9941,7 +9945,8 @@ private static Consumer> checkWarnings( final String expected = "SELECT *\n" + "FROM `EMP`\n" + "/*+ `OPTIONS`('key1' = 'val1') */"; - assertThat(toLinux(shuttled.toString()), is(expected)); + assertThat(toLinux(requireNonNull(shuttled, "shuttled").toString()), + is(expected)); } @Test void testInvalidHintFormat() { @@ -10323,7 +10328,8 @@ static SqlWriterConfig.LineFolding nextLineFolding(Random random) { } static > E nextEnum(Random random, Class enumClass) { - final E[] constants = enumClass.getEnumConstants(); + final E[] constants = + requireNonNull(enumClass.getEnumConstants(), "constants"); return constants[random.nextInt(constants.length)]; } @@ -10341,7 +10347,7 @@ static void checkList(SqlNodeList sqlNodeList, } } - static SqlNode deepCopy(SqlNode sqlNode) { + static @Nullable SqlNode deepCopy(SqlNode sqlNode) { return sqlNode.accept(new SqlShuttle() { @Override public @Nullable SqlNode visit(final SqlCall call) { // Handler always creates a new copy of 'call' @@ -10383,7 +10389,8 @@ static SqlNode deepCopy(SqlNode sqlNode) { assertThat(sql3, notNullValue()); // Make a deep copy of the SqlNodeList, unparse it. - final SqlNodeList sqlNodeList3 = (SqlNodeList) deepCopy(sqlNodeList); + final SqlNodeList sqlNodeList3 = + (SqlNodeList) requireNonNull(deepCopy(sqlNodeList), "copy"); final String sql4 = toSqlString(sqlNodeList3, simple()); // Should be the same as we started with. assertThat(sql4, is(sql1)); @@ -10433,7 +10440,7 @@ static SqlNode deepCopy(SqlNode sqlNode) { assertThat(sql4, is(sql1)); // Make a deep copy of the original SqlNode, unparse it. - final SqlNode sqlNode5 = deepCopy(sqlNode); + final SqlNode sqlNode5 = requireNonNull(deepCopy(sqlNode), "copy"); final String actual5 = sqlNode5.toSqlString(writerTransform).getSql(); assertThat(converter.apply(actual5), is(expected)); } diff --git a/testkit/src/main/java/org/apache/calcite/sql/parser/package-info.java b/testkit/src/main/java/org/apache/calcite/sql/parser/package-info.java index 717d8d6860ea..b57b590f68ea 100644 --- a/testkit/src/main/java/org/apache/calcite/sql/parser/package-info.java +++ b/testkit/src/main/java/org/apache/calcite/sql/parser/package-info.java @@ -18,4 +18,7 @@ /** * Classes for testing SQL Parser. */ +@NullMarked package org.apache.calcite.sql.parser; + +import org.jspecify.annotations.NullMarked; 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 39b0b1e3fec3..6aaf44ffa235 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 @@ -76,7 +76,8 @@ * {@link SqlValidator}. */ public abstract class AbstractSqlTester implements SqlTester, AutoCloseable { - private static final String NL = System.getProperty("line.separator"); + private static final String NL = + requireNonNull(System.getProperty("line.separator"), "line.separator"); public AbstractSqlTester() { } diff --git a/testkit/src/main/java/org/apache/calcite/sql/test/ResultCheckers.java b/testkit/src/main/java/org/apache/calcite/sql/test/ResultCheckers.java index 1fba06067f8e..2c1bfd4d15ea 100644 --- a/testkit/src/main/java/org/apache/calcite/sql/test/ResultCheckers.java +++ b/testkit/src/main/java/org/apache/calcite/sql/test/ResultCheckers.java @@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableSet; import org.hamcrest.Matcher; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.sql.ResultSet; @@ -36,6 +37,8 @@ import java.util.Set; import java.util.regex.Pattern; +import static org.apache.calcite.linq4j.Nullness.castNonNull; + import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -82,8 +85,8 @@ public static SqlTester.ResultChecker isSingle(double delta, String value) { return isSingle(value); } - public static SqlTester.ResultChecker isSingle(String value) { - return new MatcherResultChecker<>(is(value), + public static SqlTester.ResultChecker isSingle(@Nullable String value) { + return new MatcherResultChecker<@Nullable String>(is(value), JdbcType.STRING_NULLABLE); } @@ -107,7 +110,7 @@ public static SqlTester.ResultChecker isSet(String... values) { } public static SqlTester.ResultChecker isNullValue() { - return new RefSetResultChecker(Collections.singleton(null)); + return new RefSetResultChecker(Collections.singleton(castNonNull(null))); } /** @@ -129,7 +132,7 @@ static void compareResultSet(String sql, ResultSet resultSet, final String s = resultSet.getString(1); final String s0 = s == null ? "0" : s; final boolean wasNull0 = resultSet.wasNull(); - actualSet.add(s); + actualSet.add(castNonNull(s)); switch (rep) { case BOOLEAN: case PRIMITIVE_BOOLEAN: @@ -221,7 +224,7 @@ static void compareResultSetWithPattern(String sql, ResultSet resultSet, if (resultSet.next()) { fail("Query \"" + sql + "\"returned 2 or more rows, expected 1"); } - if (!pattern.matcher(actual).matches()) { + if (!pattern.matcher(requireNonNull(actual, "actual")).matches()) { fail("Query \"" + sql + "\"returned '" + actual + "', expected '" @@ -308,7 +311,8 @@ static class PatternResultChecker implements SqlTester.ResultChecker { * * @param Result type */ - static class MatcherResultChecker implements SqlTester.ResultChecker { + static class MatcherResultChecker + implements SqlTester.ResultChecker { private final Matcher matcher; private final JdbcType jdbcType; 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 e2a0fb30ec5c..bdcc09fab6c9 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 @@ -44,6 +44,7 @@ import java.util.function.Consumer; import java.util.function.UnaryOperator; +import static org.apache.calcite.linq4j.Nullness.castNonNull; import static org.apache.calcite.rel.type.RelDataTypeImpl.NON_NULLABLE_SUFFIX; import static org.apache.calcite.sql.test.ResultCheckers.isSingle; @@ -226,11 +227,11 @@ void checkScalar(String expression, */ default void checkScalar( String expression, - Object result, + @Nullable Object result, String resultType) { checkType(expression, resultType); checkScalar(expression, SqlTests.ANY_TYPE_CHECKER, - ResultCheckers.createChecker(result)); + ResultCheckers.createChecker(castNonNull(result))); } /** @@ -330,7 +331,7 @@ void checkBoolean( */ void checkString( String expression, - String result, + @Nullable String result, String resultType); /** 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 021321c27350..62c9b8b859b6 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 @@ -46,6 +46,7 @@ import static org.junit.jupiter.api.Assertions.fail; import static java.lang.Integer.parseInt; +import static java.util.Objects.requireNonNull; /** * Utility methods. @@ -261,7 +262,8 @@ public static void checkEx(@Nullable Throwable ex, int actualEndColumn = 99; if (ex instanceof ExceptionInInitializerError) { - ex = ((ExceptionInInitializerError) ex).getException(); + final ExceptionInInitializerError error = (ExceptionInInitializerError) ex; + ex = requireNonNull(error.getException(), "exception in initializer"); } // Search for an CalciteContextException somewhere in the stack. @@ -338,16 +340,22 @@ public static void checkEx(@Nullable Throwable ex, java.util.regex.Matcher matcher = LINE_COL_TWICE_PATTERN.matcher(actualMessage); if (matcher.matches()) { - actualLine = parseInt(matcher.group(1)); - actualColumn = parseInt(matcher.group(2)); - actualEndLine = parseInt(matcher.group(3)); - actualEndColumn = parseInt(matcher.group(4)); + actualLine = + parseInt(requireNonNull(matcher.group(1), "group")); + actualColumn = + parseInt(requireNonNull(matcher.group(2), "group")); + actualEndLine = + parseInt(requireNonNull(matcher.group(3), "group")); + actualEndColumn = + parseInt(requireNonNull(matcher.group(4), "group")); actualMessage = matcher.group(5); } else { matcher = LINE_COL_PATTERN.matcher(actualMessage); if (matcher.matches()) { - actualLine = parseInt(matcher.group(1)); - actualColumn = parseInt(matcher.group(2)); + actualLine = + parseInt(requireNonNull(matcher.group(1), "group")); + actualColumn = + parseInt(requireNonNull(matcher.group(2), "group")); } else { if (expectedMsgPattern != null && actualMessage.matches(expectedMsgPattern)) { @@ -403,6 +411,11 @@ public static void checkEx(@Nullable Throwable ex, actualMessage = Util.toLinux(actualMessage); } + if (expectedMsgPattern == null) { + actualException.printStackTrace(); + throw new AssertionError("Expected query not to throw exception, " + + "but it threw; query [" + sap.sql + "]", actualException); + } if (actualMessage == null || !actualMessage.matches(expectedMsgPattern)) { actualException.printStackTrace(); diff --git a/testkit/src/main/java/org/apache/calcite/sql/test/package-info.java b/testkit/src/main/java/org/apache/calcite/sql/test/package-info.java index 3babd19e16b8..2047a71eb111 100644 --- a/testkit/src/main/java/org/apache/calcite/sql/test/package-info.java +++ b/testkit/src/main/java/org/apache/calcite/sql/test/package-info.java @@ -18,4 +18,7 @@ /** * Classes for testing SQL. */ +@NullMarked package org.apache.calcite.sql.test; + +import org.jspecify.annotations.NullMarked; 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 6a551a5957d0..2d591e91e4a2 100644 --- a/testkit/src/main/java/org/apache/calcite/test/CalciteAssert.java +++ b/testkit/src/main/java/org/apache/calcite/test/CalciteAssert.java @@ -133,6 +133,7 @@ import java.util.stream.Collectors; import javax.sql.DataSource; +import static org.apache.calcite.linq4j.Nullness.castNonNull; import static org.apache.calcite.test.Matchers.compose; import static org.apache.calcite.test.Matchers.containsStringLinux; import static org.apache.calcite.test.Matchers.isLinux; @@ -197,7 +198,7 @@ private CalciteAssert() {} return this; } - @Override public AssertThat doWithConnection( + @Override public AssertThat doWithConnection( Function fn) { return this; } @@ -374,7 +375,7 @@ public static Consumer checkUpdateCount(final int expected) { static Consumer consistentResult(final boolean ordered) { return new Consumer() { int executeCount = 0; - Collection expected; + @Nullable Collection expected; @Override public void accept(ResultSet resultSet) { ++executeCount; @@ -386,7 +387,8 @@ static Consumer consistentResult(final boolean ordered) { expected = result; } else { @SuppressWarnings("UndefinedEquals") - boolean matches = expected.equals(result); + boolean matches = + requireNonNull(expected, "expected").equals(result); if (!matches) { // compare strings to get better error message assertThat(newlineList(result), equalTo(newlineList(expected))); @@ -602,7 +604,7 @@ static void assertQuery( updateCount = statement.executeUpdate(sql); } if (exceptionChecker != null) { - exceptionChecker.accept(null); + exceptionChecker.accept(castNonNull(null)); return; } } catch (Exception | Error e) { @@ -613,10 +615,10 @@ static void assertQuery( throw e; } if (resultChecker != null) { - resultChecker.accept(resultSet); + resultChecker.accept(requireNonNull(resultSet, "resultSet")); } if (updateChecker != null) { - updateChecker.accept(updateCount); + updateChecker.accept(requireNonNull(updateCount, "updateCount")); } if (resultSet != null) { resultSet.close(); @@ -678,7 +680,7 @@ private static void assertPrepare( updateCount = statement.executeUpdate(sql); } if (exceptionChecker != null) { - exceptionChecker.accept(null); + exceptionChecker.accept(castNonNull(null)); return; } } catch (Exception | Error e) { @@ -689,10 +691,10 @@ private static void assertPrepare( throw e; } if (resultChecker != null) { - resultChecker.accept(resultSet); + resultChecker.accept(requireNonNull(resultSet, "resultSet")); } if (updateChecker != null) { - updateChecker.accept(updateCount); + updateChecker.accept(requireNonNull(updateCount, "updateCount")); } if (resultSet != null) { resultSet.close(); @@ -785,7 +787,7 @@ static ImmutableMultiset toSet(ResultSet resultSet) /** Calls a non-static method via reflection. Useful for testing methods that * don't exist in certain versions of the JDK. */ - static Object call(Object o, String methodName, Object... args) + static @Nullable Object call(Object o, String methodName, Object... args) throws InvocationTargetException, IllegalAccessException { return method(o, methodName, args).invoke(o, args); } @@ -1062,7 +1064,7 @@ static SchemaPlus addSchema_(SchemaPlus rootSchema, SchemaSpec schema) { .build(); } - @Override public C unwrap(Class aClass) { + @Override public @Nullable C unwrap(Class aClass) { if (aClass.isAssignableFrom(SqlDialect.class) || aClass.isAssignableFrom(DataSource.class)) { return salesTable.unwrap(aClass); @@ -1078,7 +1080,7 @@ static SchemaPlus addSchema_(SchemaPlus rootSchema, SchemaSpec schema) { .build(); } - @Override public C unwrap(Class aClass) { + @Override public @Nullable C unwrap(Class aClass) { if (aClass.isAssignableFrom(SqlDialect.class) || aClass.isAssignableFrom(DataSource.class)) { return salesTable.unwrap(aClass); @@ -1146,11 +1148,11 @@ private static SchemaPlus addSchemaIfNotExists(SchemaPlus rootSchema, * @param actual actual value */ public static void assertArrayEqual( - String message, Object[] expected, Object[] actual) { + String message, Object @Nullable [] expected, Object @Nullable [] actual) { assertThat(message, str(actual), is(str(expected))); } - private static String str(Object[] objects) { + private static @Nullable String str(Object @Nullable [] objects) { return objects == null ? null : Arrays.stream(objects).map(Object::toString) @@ -1297,10 +1299,10 @@ public final AssertThat withMaterializations(String model, final boolean existin final String... materializations) { return withMaterializations(model, builder -> { assert materializations.length % 2 == 0; - final List list = builder.list(); + final List<@Nullable Object> list = builder.list(); for (int i = 0; i < materializations.length; i++) { String table = materializations[i++]; - final Map map = builder.map(); + final Map map = builder.map(); map.put("table", table); if (!existing) { map.put("view", table + "v"); @@ -1400,14 +1402,14 @@ public AssertThat connectThrows(Consumer exceptionChecker) { } catch (Throwable e) { throwable = e; } - exceptionChecker.accept(throwable); + exceptionChecker.accept(castNonNull(throwable)); return this; } /** Creates a {@link org.apache.calcite.jdbc.CalciteConnection} * and executes a callback. */ - public AssertThat doWithConnection(Function fn) - throws Exception { + public AssertThat doWithConnection( + Function fn) throws Exception { try (Connection connection = connectionFactory.createConnection()) { T t = fn.apply((CalciteConnection) connection); Util.discard(t); @@ -1522,7 +1524,8 @@ public AssertQuery returns2(final String expected) { return returns( checkResult(expected, new ResultSetFormatter() { - @Override protected String adjustValue(String s) { + @Override protected @Nullable String adjustValue( + @Nullable String s) { if (s != null) { if (s.contains(".")) { while (s.endsWith("0")) { @@ -2151,7 +2154,7 @@ ResultSetFormatter rowToString(ResultSet resultSet, return this; } - protected String adjustValue(String string) { + protected @Nullable String adjustValue(@Nullable String string) { if (string != null) { string = TestUtil.correctRoundedFloat(string); } diff --git a/testkit/src/main/java/org/apache/calcite/test/ConnectionFactories.java b/testkit/src/main/java/org/apache/calcite/test/ConnectionFactories.java index 2a09b9812600..d1d2016387c7 100644 --- a/testkit/src/main/java/org/apache/calcite/test/ConnectionFactories.java +++ b/testkit/src/main/java/org/apache/calcite/test/ConnectionFactories.java @@ -31,6 +31,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import org.jspecify.annotations.Nullable; + import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; @@ -102,9 +104,10 @@ private static class MapConnectionFactory implements ConnectionFactory { this.postProcessors = requireNonNull(postProcessors, "postProcessors"); } - @Override public boolean equals(Object obj) { + @Override public boolean equals(@Nullable Object obj) { return this == obj - || obj.getClass() == MapConnectionFactory.class + || obj != null + && obj.getClass() == MapConnectionFactory.class && ((MapConnectionFactory) obj).map.equals(map) && ((MapConnectionFactory) obj).postProcessors.equals(postProcessors); } 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 7ca26a1df08a..f0bf802254f5 100644 --- a/testkit/src/main/java/org/apache/calcite/test/DiffRepository.java +++ b/testkit/src/main/java/org/apache/calcite/test/DiffRepository.java @@ -17,7 +17,6 @@ package org.apache.calcite.test; import org.apache.calcite.avatica.util.Spaces; -import org.apache.calcite.linq4j.Nullness; import org.apache.calcite.util.Pair; import org.apache.calcite.util.Sources; import org.apache.calcite.util.Util; @@ -298,7 +297,7 @@ private static URL findFile(Class clazz, final String suffix) { public static DiffRepository castNonNull( @Nullable DiffRepository diffRepos) { if (diffRepos != null) { - return Nullness.castNonNull(diffRepos); + return diffRepos; } throw new IllegalArgumentException("diffRepos is null; if you require a " + "DiffRepository, set it in your test's fixture() method"); @@ -395,9 +394,9 @@ private static String getText(Element element) { // all other child elements. final NodeList childNodes = element.getChildNodes(); for (int i = 0; i < childNodes.getLength(); i++) { - Node node = childNodes.item(i); + Node node = requireNonNull(childNodes.item(i), "child"); if (node instanceof CDATASection) { - return node.getNodeValue(); + return requireNonNull(node.getNodeValue(), "CDATA text"); } } @@ -428,7 +427,7 @@ private static String getText(Element element) { @Nullable List> elements) { final NodeList childNodes = root.getChildNodes(); for (int i = 0; i < childNodes.getLength(); i++) { - Node child = childNodes.item(i); + Node child = requireNonNull(childNodes.item(i), "child"); if (child.getNodeName().equals(TEST_CASE_TAG)) { Element testCase = (Element) child; final String name = testCase.getAttribute(TEST_CASE_NAME_ATTR); @@ -502,7 +501,7 @@ private static String getCurrentTestCaseName() { } public void assertEquals(String tag, String expected, String actual) { - final String testCaseName = getCurrentTestCaseName(true); + final String testCaseName = getCurrentTestCaseName(); String expected2 = expand(tag, expected); if (expected2 == null) { update(testCaseName, expected, actual); @@ -619,7 +618,8 @@ private synchronized void flushDoc() { return; } try { - boolean b = logFile.getParentFile().mkdirs(); + boolean b = + requireNonNull(logFile.getParentFile(), "log file directory").mkdirs(); Util.discard(b); try (Writer w = Util.printWriter(logFile)) { write(doc, w, indent); @@ -645,7 +645,7 @@ private static SortedMap analyze(Element root) { final SortedMap testCases = new TreeMap<>(); final NodeList childNodes = root.getChildNodes(); for (int i = 0; i < childNodes.getLength(); i++) { - Node child = childNodes.item(i); + Node child = requireNonNull(childNodes.item(i), "child"); if (child.getNodeName().equals(TEST_CASE_TAG)) { Element testCase = (Element) child; final String name = testCase.getAttribute(TEST_CASE_NAME_ATTR); @@ -671,7 +671,7 @@ private static Boolean checkExists(Element root, Set javaTestMethods, } if (!existsOnlyInXml.isEmpty()) { for (String value : existsOnlyInXml) { - root.removeChild(testCases.get(value)); + root.removeChild(requireNonNull(testCases.get(value), value)); } } @@ -689,7 +689,7 @@ private static ImmutableSortedSet validateOrder(Element root, final NodeList childNodes = root.getChildNodes(); for (int i = 0; i < childNodes.getLength(); i++) { - Node child = childNodes.item(i); + Node child = requireNonNull(childNodes.item(i), "child"); if (child.getNodeName().equals(TEST_CASE_TAG)) { Element testCase = (Element) child; String name = testCase.getAttribute(TEST_CASE_NAME_ATTR); @@ -742,7 +742,7 @@ private static ImmutableSortedSet validateOrder(Element root, Element found = null; final List kills = new ArrayList<>(); for (int i = 0; i < childNodes.getLength(); i++) { - Node child = childNodes.item(i); + Node child = requireNonNull(childNodes.item(i), "child"); if (child.getNodeName().equals(RESOURCE_TAG) && resourceName.equals( ((Element) child).getAttribute(RESOURCE_NAME_ATTR))) { @@ -762,7 +762,7 @@ private static ImmutableSortedSet validateOrder(Element root, private static void removeAllChildren(Element element) { final NodeList childNodes = element.getChildNodes(); while (childNodes.getLength() > 0) { - element.removeChild(childNodes.item(0)); + element.removeChild(requireNonNull(childNodes.item(0), "child")); } } @@ -814,7 +814,7 @@ private static void writeNode(Node node, XmlOutput out) { out.print("\n"); childNodes = node.getChildNodes(); for (int i = 0; i < childNodes.getLength(); i++) { - Node child = childNodes.item(i); + Node child = requireNonNull(childNodes.item(i), "child"); writeNode(child, out); } break; @@ -825,19 +825,20 @@ private static void writeNode(Node node, XmlOutput out) { out.beginBeginTag(tagName); // Attributes. - final NamedNodeMap attributeMap = element.getAttributes(); + final NamedNodeMap attributeMap = + requireNonNull(element.getAttributes(), "attributes"); for (int i = 0; i < attributeMap.getLength(); i++) { - final Node att = attributeMap.item(i); + final Node att = requireNonNull(attributeMap.item(i), "attribute"); out.attribute( att.getNodeName(), - att.getNodeValue()); + requireNonNull(att.getNodeValue(), "attribute value")); } out.endBeginTag(tagName); // Write child nodes, ignoring attributes but including text. childNodes = node.getChildNodes(); for (int i = 0; i < childNodes.getLength(); i++) { - Node child = childNodes.item(i); + Node child = requireNonNull(childNodes.item(i), "child"); if (child.getNodeType() == Node.ATTRIBUTE_NODE) { continue; } @@ -849,7 +850,7 @@ private static void writeNode(Node node, XmlOutput out) { case Node.ATTRIBUTE_NODE: out.attribute( node.getNodeName(), - node.getNodeValue()); + requireNonNull(node.getNodeValue(), "attribute value")); break; case Node.CDATA_SECTION_NODE: @@ -861,7 +862,7 @@ private static void writeNode(Node node, XmlOutput out) { case Node.TEXT_NODE: Text text = (Text) node; - final String wholeText = text.getNodeValue(); + final String wholeText = requireNonNull(text.getNodeValue(), "text"); if (!isWhitespace(wholeText)) { out.cdata(wholeText, false); } @@ -979,7 +980,7 @@ private static class Key { return Objects.hash(clazz, baseRepository, filter); } - @Override public boolean equals(Object obj) { + @Override public boolean equals(@Nullable Object obj) { return this == obj || obj instanceof Key && clazz.equals(((Key) obj).clazz) @@ -1006,7 +1007,7 @@ DiffRepository toRepo() { private static Iterable iterate(NodeList nodeList) { return new AbstractList() { @Override public Node get(int index) { - return nodeList.item(index); + return requireNonNull(nodeList.item(index), "node"); } @Override public int size() { diff --git a/testkit/src/main/java/org/apache/calcite/test/Matchers.java b/testkit/src/main/java/org/apache/calcite/test/Matchers.java index 0ae23f31f1f0..cd1602fa7918 100644 --- a/testkit/src/main/java/org/apache/calcite/test/Matchers.java +++ b/testkit/src/main/java/org/apache/calcite/test/Matchers.java @@ -55,6 +55,8 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.ImmutableList.toImmutableList; +import static org.apache.calcite.linq4j.Nullness.castNonNull; + import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.Matchers.closeTo; @@ -208,7 +210,8 @@ public static Matcher compose(Matcher matcher, * @see Util#toLinux(String) */ public static Matcher isLinux(final String value) { - return compose(Is.is(value), input -> input == null ? null : Util.toLinux(input)); + return compose(Is.is(value), + input -> input == null ? castNonNull(null) : Util.toLinux(input)); } /** Matcher that matches a {@link RelNode} if the {@code RelNode} is valid 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 40549361543c..6dcf9bb8fbc1 100644 --- a/testkit/src/main/java/org/apache/calcite/test/MockRelOptPlanner.java +++ b/testkit/src/main/java/org/apache/calcite/test/MockRelOptPlanner.java @@ -39,6 +39,8 @@ import java.util.List; import java.util.Map; +import static java.util.Objects.requireNonNull; + /** * MockRelOptPlanner is a mock implementation of the {@link RelOptPlanner} * interface. @@ -46,10 +48,14 @@ public class MockRelOptPlanner extends AbstractRelOptPlanner { //~ Instance fields -------------------------------------------------------- + /** Set by {@link #setRoot}, which every caller does first. */ + @SuppressWarnings("NullAway.Init") private RelNode root; private @Nullable RelOptRule rule; + /** Set while a rule fires. */ + @SuppressWarnings("NullAway.Init") private RelNode transformationResult; private long metadataTimestamp = 0L; @@ -118,7 +124,7 @@ private boolean matchRecursive( int ordinalInParent) { List bindings = new ArrayList(); if (match( - rule.getOperand(), + requireNonNull(rule, "rule").getOperand(), rel, bindings)) { MockRuleCall call = @@ -187,7 +193,7 @@ private static boolean match(RelOptRuleOperand operand, RelNode rel, return rel; } - @Override public RelNode ensureRegistered(RelNode rel, RelNode equivRel) { + @Override public RelNode ensureRegistered(RelNode rel, @Nullable RelNode equivRel) { return rel; } 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 7f73e74b9821..0028f03d7610 100644 --- a/testkit/src/main/java/org/apache/calcite/test/MockSqlOperatorTable.java +++ b/testkit/src/main/java/org/apache/calcite/test/MockSqlOperatorTable.java @@ -216,6 +216,9 @@ public DedupFunction() { /** "TFRT" user-defined table function. */ public static class TableFunctionReturnTableFunction extends SqlFunction implements SqlTableFunction { + /** Set by the constructor after the super call, which needs the operator + * to exist first. */ + @SuppressWarnings("NullAway.Init") TableFunctionReturnTypeInference inference; public TableFunctionReturnTableFunction() { @@ -283,7 +286,7 @@ private static RelDataType inferRowType(SqlOperatorBinding opBinding) { return ScoreTableFunction::inferRowType; } - @Override public TableCharacteristic tableCharacteristic(int ordinal) { + @Override public @Nullable TableCharacteristic tableCharacteristic(int ordinal) { return tableParams.get(ordinal); } @@ -356,7 +359,7 @@ private static RelDataType inferRowType(SqlOperatorBinding opBinding) { return TopNTableFunction::inferRowType; } - @Override public TableCharacteristic tableCharacteristic(int ordinal) { + @Override public @Nullable TableCharacteristic tableCharacteristic(int ordinal) { return tableParams.get(ordinal); } @@ -435,7 +438,7 @@ public SimilarlityTableFunction() { .build(); } - @Override public TableCharacteristic tableCharacteristic(int ordinal) { + @Override public @Nullable TableCharacteristic tableCharacteristic(int ordinal) { return tableParams.get(ordinal); } @@ -505,7 +508,7 @@ public InvalidTableFunction() { .build(); } - @Override public TableCharacteristic tableCharacteristic(int ordinal) { + @Override public @Nullable TableCharacteristic tableCharacteristic(int ordinal) { return tableParams.get(ordinal); } 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 ac21cf102490..d92d81794c9e 100644 --- a/testkit/src/main/java/org/apache/calcite/test/QuidemTest.java +++ b/testkit/src/main/java/org/apache/calcite/test/QuidemTest.java @@ -85,6 +85,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; +import static org.apache.calcite.linq4j.Nullness.castNonNull; import static org.apache.calcite.runtime.SqlFunctions.resetThreadSequences; import static org.apache.calcite.sql2rel.SqlToRelConverter.DEFAULT_IN_SUB_QUERY_THRESHOLD; @@ -162,10 +163,11 @@ protected boolean useTopDownGeneralDecorrelator() { case "use_new_decorr": return useTopDownGeneralDecorrelator(); case "jdk18": - return System.getProperty("java.version").startsWith("1.8"); + return requireNonNull(System.getProperty("java.version"), "java.version") + .startsWith("1.8"); case "fixed": // Quidem requires a Java 8 function - return (Function) v -> { + return (Function) v -> { switch (v) { case "calcite1045": return Bug.CALCITE_1045_FIXED; @@ -175,7 +177,7 @@ protected boolean useTopDownGeneralDecorrelator() { return null; }; case "not": - return (Function) v -> { + return (Function) v -> { final Object o = getEnv(v); if (o instanceof Function) { @SuppressWarnings("unchecked") final Function f = @@ -208,7 +210,8 @@ protected static Collection data(String first) { final URL inUrl = QuidemTest.class.getResource("/" + n2u(first)); final File firstFile = Sources.of(requireNonNull(inUrl, "inUrl")).file(); final int commonPrefixLength = firstFile.getAbsolutePath().length() - first.length(); - final File dir = firstFile.getParentFile(); + final File dir = + requireNonNull(firstFile.getParentFile(), "parent of " + firstFile); final List paths = new ArrayList<>(); final FilenameFilter filter = new PatternFilenameFilter(".*\\.iq$"); for (File f : Util.first(dir.listFiles(filter), new File[0])) { @@ -257,7 +260,8 @@ protected void checkRun(String path) throws Exception { outFile = replaceDir(inFile, "resources", "quidem/" + getClass().getSimpleName()); } - Util.discard(outFile.getParentFile().mkdirs()); + Util.discard( + requireNonNull(outFile.getParentFile(), "parent of " + outFile).mkdirs()); try (Reader reader = Util.reader(inFile); Writer writer = Util.printWriter(outFile); Closer closer = new Closer()) { @@ -317,7 +321,7 @@ protected void checkRun(String path) throws Exception { if (value.equals("original")) { closer.add( Hook.PROGRAM.addThread((Consumer>) - holder -> holder.set(null))); + holder -> holder.set(castNonNull(null)))); } else { closer.add( Hook.PROGRAM.addThread((Consumer>) @@ -384,15 +388,18 @@ private static void parseRules(String value, List rulesAdd, Matcher matcher = pattern.matcher(value); while (matcher.find()) { - char operation = matcher.group(1).charAt(0); + char operation = + requireNonNull(matcher.group(1), "operation").charAt(0); String ruleSource = matcher.group(3); - String ruleName = matcher.group(4); + String ruleName = requireNonNull(matcher.group(4), "ruleName"); try { if (ruleSource == null || ruleSource.equals("CoreRules")) { setRules(operation, getCoreRule(ruleName), rulesAdd, rulesRemove); } else if (ruleSource.equals("EnumerableRules")) { - Object rule = EnumerableRules.class.getField(ruleName).get(null); + Object rule = + requireNonNull(EnumerableRules.class.getField(ruleName).get(null), + ruleName); setRules(operation, (RelOptRule) rule, rulesAdd, rulesRemove); } else { throw new RuntimeException("Unknown rule: " + ruleName); @@ -413,9 +420,10 @@ private static void applyRulesInOrder(String value, Matcher matcher = pattern.matcher(value); while (matcher.find()) { - char operation = matcher.group(1).charAt(0); + char operation = + requireNonNull(matcher.group(1), "operation").charAt(0); String ruleSource = matcher.group(3); - String ruleName = matcher.group(4); + String ruleName = requireNonNull(matcher.group(4), "ruleName"); try { RelOptRule rule; @@ -423,7 +431,9 @@ private static void applyRulesInOrder(String value, if (ruleSource == null || ruleSource.equals("CoreRules")) { rule = getCoreRule(ruleName); } else if (ruleSource.equals("EnumerableRules")) { - Object ruleObj = EnumerableRules.class.getField(ruleName).get(null); + Object ruleObj = + requireNonNull(EnumerableRules.class.getField(ruleName).get(null), + ruleName); rule = (RelOptRule) ruleObj; targetVolcano = true; } else { @@ -550,12 +560,12 @@ public void test(String path) throws Exception { /** Quidem connection factory for Calcite's built-in test schemas. */ protected class QuidemConnectionFactory implements Quidem.ConnectionFactory { - public Connection connect(String name) throws Exception { + public @Nullable Connection connect(String name) throws Exception { return connect(name, false); } - @Override public Connection connect(String name, boolean reference) - throws Exception { + @Override public @Nullable Connection connect(String name, + boolean reference) throws Exception { if (reference) { if (name.equals("foodmart")) { final ConnectionSpec db = @@ -654,8 +664,9 @@ public Connection connect(String name) throws Exception { final Connection connection = customize(CalciteAssert.that() .withSchema("s", new AbstractSchema())) .connect(); - connection.unwrap(CalciteConnection.class).getRootSchema() - .subSchemas().get("s") + requireNonNull( + connection.unwrap(CalciteConnection.class).getRootSchema() + .subSchemas().get("s"), "schema s") .add("my_seq", new AbstractTable() { @Override public RelDataType getRowType( diff --git a/testkit/src/main/java/org/apache/calcite/test/RelMetadataFixture.java b/testkit/src/main/java/org/apache/calcite/test/RelMetadataFixture.java index 4214587ddc58..cf264898889e 100644 --- a/testkit/src/main/java/org/apache/calcite/test/RelMetadataFixture.java +++ b/testkit/src/main/java/org/apache/calcite/test/RelMetadataFixture.java @@ -47,6 +47,7 @@ import com.google.common.collect.Multimap; import org.hamcrest.Matcher; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.HashMap; @@ -69,6 +70,8 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static java.util.Objects.requireNonNull; + /** * Parameters for a Metadata test. */ @@ -228,7 +231,7 @@ public RelNode toRel() { public RelMetadataFixture assertCpuCost(Matcher matcher, String reason) { RelNode rel = toRel(); - RelOptCost cost = computeRelSelfCost(rel); + RelOptCost cost = requireNonNull(computeRelSelfCost(rel), "cost"); assertThat(reason + "\n" + "sql:" + relSupplier + "\n" + "plan:" + RelOptUtil.toString(rel, SqlExplainLevel.ALL_ATTRIBUTES), @@ -236,7 +239,7 @@ public RelMetadataFixture assertCpuCost(Matcher matcher, return this; } - private static RelOptCost computeRelSelfCost(RelNode rel) { + private static @Nullable RelOptCost computeRelSelfCost(RelNode rel) { final RelMetadataQuery mq = rel.getCluster().getMetadataQuery(); RelOptPlanner planner = new VolcanoPlanner(); return rel.computeSelfCost(planner, mq); @@ -279,7 +282,8 @@ private RelMetadataFixture checkColumnOrigin( Consumer> action) { RelNode rel = toRel(); final RelMetadataQuery mq = rel.getCluster().getMetadataQuery(); - final Set columnOrigins = mq.getColumnOrigins(rel, 0); + final Set columnOrigins = + requireNonNull(mq.getColumnOrigins(rel, 0), "columnOrigins"); action.accept(columnOrigins); return this; } @@ -365,7 +369,8 @@ public RelMetadataFixture assertThatUniqueKeysAre(boolean ignoreNulls, ImmutableBitSet... expectedUniqueKeys) { RelNode rel = toRel(); final RelMetadataQuery mq = rel.getCluster().getMetadataQuery(); - Set result = mq.getUniqueKeys(rel, ignoreNulls); + Set result = + requireNonNull(mq.getUniqueKeys(rel, ignoreNulls), "uniqueKeys"); assertThat(result, notNullValue()); assertThat("unique keys, sql: " + relSupplier + ", rel: " + RelOptUtil.toString(rel), @@ -382,7 +387,8 @@ public RelMetadataFixture assertThatUniqueKeysAre(boolean ignoreNulls, */ private static void checkUniqueConsistent(RelNode rel, boolean ignoreNulls) { final RelMetadataQuery mq = rel.getCluster().getMetadataQuery(); - final Set uniqueKeys = mq.getUniqueKeys(rel, ignoreNulls); + final Set uniqueKeys = + requireNonNull(mq.getUniqueKeys(rel, ignoreNulls), "uniqueKeys"); assertThat(uniqueKeys, notNullValue()); for (ImmutableBitSet key : uniqueKeys) { Boolean result2 = mq.areColumnsUnique(rel, key, ignoreNulls); @@ -489,7 +495,8 @@ public RelMetadataFixture assertThatNodeTypeCount( Matcher, Integer>> matcher) { final RelNode rel = toRel(); final RelMetadataQuery mq = rel.getCluster().getMetadataQuery(); - final Multimap, RelNode> result = mq.getNodeTypes(rel); + final Multimap, RelNode> result = + requireNonNull(mq.getNodeTypes(rel), "nodeTypes"); assertThat(result, notNullValue()); final Map, Integer> resultCount = new HashMap<>(); for (Map.Entry, Collection> e : result.asMap().entrySet()) { 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 d65d3f2fb42f..4afc67f94d8a 100644 --- a/testkit/src/main/java/org/apache/calcite/test/RelOptFixture.java +++ b/testkit/src/main/java/org/apache/calcite/test/RelOptFixture.java @@ -97,7 +97,7 @@ public class RelOptFixture { final SqlTestFactory factory; final @Nullable DiffRepository diffRepos; final @Nullable HepProgram preProgram; - final RelOptPlanner planner; + final @Nullable RelOptPlanner planner; final ImmutableMap> hooks; final BiFunction before; final BiFunction after; @@ -107,7 +107,7 @@ public class RelOptFixture { RelOptFixture(SqlTester tester, SqlTestFactory factory, @Nullable DiffRepository diffRepos, RelSupplier relSupplier, - @Nullable HepProgram preProgram, RelOptPlanner planner, + @Nullable HepProgram preProgram, @Nullable RelOptPlanner planner, ImmutableMap> hooks, BiFunction before, BiFunction after, @@ -391,6 +391,7 @@ private void checkPlanning(boolean unchanged) { } else { r2 = relBefore; } + final RelOptPlanner planner = requireNonNull(this.planner, "planner"); planner.setRoot(r2); final RelNode r3 = planner.findBestExp(); diff --git a/testkit/src/main/java/org/apache/calcite/test/RelSupplier.java b/testkit/src/main/java/org/apache/calcite/test/RelSupplier.java index ffcc7bd45f4d..b89a6dc7adeb 100644 --- a/testkit/src/main/java/org/apache/calcite/test/RelSupplier.java +++ b/testkit/src/main/java/org/apache/calcite/test/RelSupplier.java @@ -26,6 +26,8 @@ import org.apache.calcite.tools.Programs; import org.apache.calcite.tools.RelBuilder; +import org.jspecify.annotations.Nullable; + import java.util.List; import java.util.function.Function; @@ -84,7 +86,7 @@ private SqlRelSupplier(String sql) { return sql; } - @Override public boolean equals(Object o) { + @Override public boolean equals(@Nullable Object o) { return o == this || o instanceof SqlRelSupplier && ((SqlRelSupplier) o).sql.equals(this.sql); @@ -123,7 +125,7 @@ private FnRelSupplier(Function relFn) { return relFn.hashCode(); } - @Override public boolean equals(Object o) { + @Override public boolean equals(@Nullable Object o) { return o == this || o instanceof FnRelSupplier && ((FnRelSupplier) o).relFn == relFn; 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 b491d6f7290f..5bb6694b5ec4 100644 --- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorFixtureImpl.java +++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorFixtureImpl.java @@ -276,7 +276,7 @@ private void checkAgg(String expr, String[] inputValues, @Override public void checkString( String expression, - String result, + @Nullable String result, String expectedType) { SqlTester.TypeChecker typeChecker = new SqlTests.StringTypeChecker(expectedType); 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 d86f15e1ef52..fe19ebbe110f 100644 --- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java +++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java @@ -16726,13 +16726,13 @@ void testTimestampDiff(boolean coercionEnabled) { final SqlOperatorFixture f = fixture(); QUANTIFY_OPERATORS.forEach(operator -> f.setFor(operator, SqlOperatorFixture.VmName.EXPAND)); - Function2 checkBoolean = (sql, result) -> { + Function2 checkBoolean = (sql, result) -> { f.checkBoolean(sql.replace("COLLECTION", "ARRAY"), result); f.checkBoolean(sql.replace("COLLECTION", "MULTISET"), result); return null; }; - Function1 checkNull = sql -> { + Function1 checkNull = sql -> { f.checkNull(sql.replace("COLLECTION", "ARRAY")); f.checkNull(sql.replace("COLLECTION", "MULTISET")); return null; @@ -18548,11 +18548,11 @@ private List getValues(BasicSqlType type, boolean inBound) { */ private static class ValueOrExceptionResultChecker implements SqlTester.ResultChecker { - private final Object expected; + private final @Nullable Object expected; private final Pattern[] patterns; ValueOrExceptionResultChecker( - Object expected, Pattern... patterns) { + @Nullable Object expected, Pattern... patterns) { this.expected = expected; this.patterns = patterns; } @@ -18629,16 +18629,16 @@ public TesterImpl() { /** A type, a value, and its {@link SqlNode} representation. */ static class ValueType { final RelDataType type; - final Object value; + final @Nullable Object value; final SqlNode node; - ValueType(RelDataType type, Object value) { + ValueType(RelDataType type, @Nullable Object value) { this.type = type; this.value = value; this.node = literal(type, value); } - private SqlNode literal(RelDataType type, Object value) { + private SqlNode literal(RelDataType type, @Nullable Object value) { if (value == null) { return SqlStdOperatorTable.CAST.createCall( SqlParserPos.ZERO, diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlToRelTestBase.java b/testkit/src/main/java/org/apache/calcite/test/SqlToRelTestBase.java index 05d5b4efdd8e..41e5c99bf5c9 100644 --- a/testkit/src/main/java/org/apache/calcite/test/SqlToRelTestBase.java +++ b/testkit/src/main/java/org/apache/calcite/test/SqlToRelTestBase.java @@ -29,6 +29,8 @@ import java.util.List; +import static java.util.Objects.requireNonNull; + /** * SqlToRelTestBase is an abstract base for tests which involve conversion from * SQL to relational algebra. @@ -42,7 +44,8 @@ public abstract class SqlToRelTestBase { //~ Static fields/initializers --------------------------------------------- - protected static final String NL = System.getProperty("line.separator"); + protected static final String NL = + requireNonNull(System.getProperty("line.separator"), "line.separator"); //~ Instance fields -------------------------------------------------------- diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlValidatorFixture.java b/testkit/src/main/java/org/apache/calcite/test/SqlValidatorFixture.java index c96c98f725f8..6222e37346c1 100644 --- a/testkit/src/main/java/org/apache/calcite/test/SqlValidatorFixture.java +++ b/testkit/src/main/java/org/apache/calcite/test/SqlValidatorFixture.java @@ -48,6 +48,7 @@ import org.apache.calcite.util.Util; import org.hamcrest.Matcher; +import org.jspecify.annotations.Nullable; import java.nio.charset.Charset; import java.util.List; @@ -288,7 +289,7 @@ public SqlValidatorFixture assertMonotonicity( (sap, validator, n) -> { final RelDataType rowType = validator.getValidatedNodeType(n); final SqlValidatorNamespace selectNamespace = - validator.getNamespace(n); + requireNonNull(validator.getNamespace(n), "namespace"); final String field0 = rowType.getFieldList().get(0).getName(); final SqlMonotonicity monotonicity = selectNamespace.getMonotonicity(field0); @@ -332,6 +333,7 @@ public void assertCollation(Matcher collationMatcher, RelDataType actualType = fields.get(0).getType(); SqlCollation collation = actualType.getCollation(); assertThat(collation, notNullValue()); + requireNonNull(collation, "collation"); assertThat(collation.getCollationName(), collationMatcher); assertThat(collation.getCoercibility(), coercibilityMatcher); })); @@ -435,10 +437,10 @@ public SqlValidatorFixture isAggregate(Matcher matcher) { */ public SqlValidatorFixture assertFieldOrigin(Matcher matcher) { tester.validateAndThen(factory, toSql(false), (sap, validator, n) -> { - final List> list = validator.getFieldOrigins(n); + final List<@Nullable List> list = validator.getFieldOrigins(n); final StringBuilder buf = new StringBuilder("{"); int i = 0; - for (List strings : list) { + for (@Nullable List strings : list) { if (i++ > 0) { buf.append(", "); } 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 e0e84ae923ee..15634fe9dc7d 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 @@ -107,6 +107,8 @@ import java.util.Map; import java.util.Set; +import static org.apache.calcite.linq4j.Nullness.castNonNull; + import static java.util.Objects.requireNonNull; /** @@ -319,7 +321,11 @@ public static class MockTable extends Prepare.AbstractPreparingTable protected final List keyList = new ArrayList<>(); protected final List referentialConstraints = new ArrayList<>(); + /** Set by {@code onRegister}, before anything asks for the row type. */ + @SuppressWarnings("NullAway.Init") protected RelDataType rowType; + /** Set by {@code onRegister}, before anything asks for the collations. */ + @SuppressWarnings("NullAway.Init") protected List collationList; protected final List names; protected final Double maxRowCount; @@ -445,7 +451,7 @@ protected ModifiableTable(String tableName) { throw new UnsupportedOperationException(); } - @Override public C unwrap(Class aClass) { + @Override public @Nullable C unwrap(Class aClass) { if (aClass.isInstance(initializerFactory)) { return aClass.cast(initializerFactory); } else if (aClass.isInstance(MockTable.this)) { @@ -550,7 +556,7 @@ public static MockTable create(MockCatalogReader catalogReader, return table; } - @Override public T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (clazz.isInstance(this)) { return clazz.cast(this); } @@ -762,8 +768,9 @@ public static MockModifiableViewRelOptTable create(MockModifiableViewTable modif : NullInitializerExpressionFactory.INSTANCE; return new MockModifiableViewRelOptTable(modifiableViewTable, catalogReader, catalogName, schemaName, name, stream, rowCount, - resolver, Util.first(initializerExpressionFactory, - NullInitializerExpressionFactory.INSTANCE)); + castNonNull(resolver), + Util.first(initializerExpressionFactory, + NullInitializerExpressionFactory.INSTANCE)); } public static MockViewTableMacro viewMacro(CalciteSchema schema, String viewSql, @@ -781,7 +788,7 @@ public static MockViewTableMacro viewMacro(CalciteSchema schema, String viewSql, monotonicColumnSet, kind, resolver, initializerFactory); } - @Override public T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (clazz.isInstance(modifiableViewTable)) { return clazz.cast(modifiableViewTable); } @@ -799,13 +806,17 @@ public static class MockViewTableMacro extends ViewTableMacro { @Override protected ModifiableViewTable modifiableViewTable( CalcitePrepare.AnalyzeViewResult parsed, String viewSql, - List schemaPath, List viewPath, CalciteSchema schema) { + List schemaPath, @Nullable List viewPath, + CalciteSchema schema) { final JavaTypeFactory typeFactory = (JavaTypeFactory) parsed.typeFactory; final Type elementType = typeFactory.getJavaClass(parsed.rowType); return new MockModifiableViewTable(elementType, RelDataTypeImpl.proto(parsed.rowType), viewSql, schemaPath, viewPath, - parsed.table, Schemas.path(schema.root(), parsed.tablePath), - parsed.constraint, parsed.columnMapping); + requireNonNull(parsed.table, "table"), + Schemas.path(schema.root(), + requireNonNull(parsed.tablePath, "tablePath")), + requireNonNull(parsed.constraint, "constraint"), + requireNonNull(parsed.columnMapping, "columnMapping")); } } @@ -816,7 +827,7 @@ public static class MockModifiableViewTable extends ModifiableViewTable { private final RexNode constraint; MockModifiableViewTable(Type elementType, RelProtoDataType rowType, - String viewSql, List schemaPath, List viewPath, + String viewSql, List schemaPath, @Nullable List viewPath, Table table, Path tablePath, RexNode constraint, ImmutableIntList columnMapping) { super(elementType, rowType, viewSql, schemaPath, viewPath, table, @@ -862,8 +873,9 @@ public static MockRelViewTable create(ViewTable viewTable, : NullInitializerExpressionFactory.INSTANCE; return new MockRelViewTable(viewTable, catalogReader, catalogName, schemaName, name, stream, rowCount, - resolver, Util.first(initializerExpressionFactory, - NullInitializerExpressionFactory.INSTANCE)); + castNonNull(resolver), + Util.first(initializerExpressionFactory, + NullInitializerExpressionFactory.INSTANCE)); } @Override public RelDataType getRowType() { @@ -874,7 +886,7 @@ public static MockRelViewTable create(ViewTable viewTable, return viewTable.toRel(context, this); } - @Override public T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (clazz.isInstance(viewTable)) { return clazz.cast(viewTable); } @@ -899,7 +911,7 @@ public abstract static class MockViewTable extends MockTable { super(catalogReader, catalogName, schemaName, name, stream, false, rowCount, resolver, initializerFactory); this.fromTable = fromTable; - this.table = fromTable.unwrap(Table.class); + this.table = fromTable.unwrapOrThrow(Table.class); this.mapping = mapping; } @@ -907,7 +919,7 @@ public abstract static class MockViewTable extends MockTable { private class ModifiableView extends AbstractModifiableView implements Wrapper { @Override public Table getTable() { - return fromTable.unwrap(Table.class); + return fromTable.unwrapOrThrow(Table.class); } @Override public Path getTablePath() { @@ -941,7 +953,7 @@ private class ModifiableView extends AbstractModifiableView }); } - @Override public C unwrap(Class aClass) { + @Override public @Nullable C unwrap(Class aClass) { if (table instanceof Wrapper) { final C c = ((Wrapper) table).unwrap(aClass); if (c != null) { @@ -968,7 +980,7 @@ private class ModifiableViewWithCustomColumnResolving return resolver.resolveColumn(rowType, typeFactory, names); } - @Override public C unwrap(Class aClass) { + @Override public @Nullable C unwrap(Class aClass) { if (table instanceof Wrapper) { final C c = ((Wrapper) table).unwrap(aClass); if (c != null) { @@ -1007,7 +1019,7 @@ protected abstract RexNode getConstraint(RexBuilder rexBuilder, ImmutableSet.of()); } - @Override public T unwrap(Class clazz) { + @Override public @Nullable T unwrap(Class clazz) { if (clazz.isAssignableFrom(ModifiableView.class)) { ModifiableView view = resolver == null ? new ModifiableView() @@ -1106,7 +1118,7 @@ private static class WrapperTable implements Table, Wrapper { this.table = table; } - @Override public C unwrap(Class aClass) { + @Override public @Nullable C unwrap(Class aClass) { return aClass.isInstance(this) ? aClass.cast(this) : aClass.isInstance(table) ? aClass.cast(table) : null; 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 e464c3855c5c..1ccdf5be5c25 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 @@ -36,6 +36,7 @@ import com.google.common.collect.ImmutableList; import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.util.Arrays; @@ -69,7 +70,7 @@ protected MockCatalogReaderSimple(RelDataTypeFactory typeFactory, return new MockCatalogReaderSimple(typeFactory, caseSensitive).init(); } - @Override public RelDataType getNamedType(SqlIdentifier typeName) { + @Override public @Nullable RelDataType getNamedType(SqlIdentifier typeName) { if (typeName.equalsDeep(addressType.getSqlIdentifier(), Litmus.IGNORE)) { return addressType; } else { diff --git a/testkit/src/main/java/org/apache/calcite/test/catalog/package-info.java b/testkit/src/main/java/org/apache/calcite/test/catalog/package-info.java index d8131acceb2f..63cc4b0fb9e7 100644 --- a/testkit/src/main/java/org/apache/calcite/test/catalog/package-info.java +++ b/testkit/src/main/java/org/apache/calcite/test/catalog/package-info.java @@ -18,4 +18,7 @@ /** * Classes for testing Catalog. */ +@NullMarked package org.apache.calcite.test.catalog; + +import org.jspecify.annotations.NullMarked; diff --git a/testkit/src/main/java/org/apache/calcite/test/package-info.java b/testkit/src/main/java/org/apache/calcite/test/package-info.java index 2c6b382c358b..0485523a9767 100644 --- a/testkit/src/main/java/org/apache/calcite/test/package-info.java +++ b/testkit/src/main/java/org/apache/calcite/test/package-info.java @@ -18,4 +18,7 @@ /** * Classes for testing Calcite. */ +@NullMarked package org.apache.calcite.test; + +import org.jspecify.annotations.NullMarked; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/bookstore/package-info.java b/testkit/src/main/java/org/apache/calcite/test/schemata/bookstore/package-info.java new file mode 100644 index 000000000000..b16f422752a8 --- /dev/null +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/bookstore/package-info.java @@ -0,0 +1,24 @@ +/* + * 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. + */ + +/** + * Bookstore schema, used by tests that query nested collections. + */ +@NullMarked +package org.apache.calcite.test.schemata.bookstore; + +import org.jspecify.annotations.NullMarked; 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 2aad0b3c4b8c..a8e98d194816 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 @@ -35,6 +35,8 @@ import java.util.Date; import java.util.List; +import static java.util.Objects.requireNonNull; + /** * Object whose fields are relations. Called "catch-all" because it's OK * if tests add new fields. @@ -97,9 +99,9 @@ public class CatchallSchema { private static boolean isNumeric(Class type) { switch (Primitive.flavor(type)) { case BOX: - return Primitive.ofBox(type).isNumeric(); + return requireNonNull(Primitive.ofBox(type), "boxed primitive").isNumeric(); case PRIMITIVE: - return Primitive.of(type).isNumeric(); + return requireNonNull(Primitive.of(type), "primitive").isNumeric(); default: return Number.class.isAssignableFrom(type); // e.g. BigDecimal } diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/catchall/package-info.java b/testkit/src/main/java/org/apache/calcite/test/schemata/catchall/package-info.java new file mode 100644 index 000000000000..5902505804cb --- /dev/null +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/catchall/package-info.java @@ -0,0 +1,24 @@ +/* + * 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. + */ + +/** + * Schema of Java objects that covers every type the reflective schema maps. + */ +@NullMarked +package org.apache.calcite.test.schemata.catchall; + +import org.jspecify.annotations.NullMarked; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/countries/package-info.java b/testkit/src/main/java/org/apache/calcite/test/schemata/countries/package-info.java new file mode 100644 index 000000000000..d7447d9a46be --- /dev/null +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/countries/package-info.java @@ -0,0 +1,24 @@ +/* + * 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. + */ + +/** + * Table functions over a fixed list of countries and states. + */ +@NullMarked +package org.apache.calcite.test.schemata.countries; + +import org.jspecify.annotations.NullMarked; 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 4ff4ef972a7f..138b81380dea 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 @@ -65,7 +65,7 @@ public SalesFact(int cust_id, int prod_id) { this.prod_id = prod_id; } - @Override public boolean equals(Object obj) { + @Override public boolean equals(@Nullable Object obj) { return obj == this || obj instanceof SalesFact && cust_id == ((SalesFact) obj).cust_id diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/foodmart/package-info.java b/testkit/src/main/java/org/apache/calcite/test/schemata/foodmart/package-info.java new file mode 100644 index 000000000000..ee9f3c195336 --- /dev/null +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/foodmart/package-info.java @@ -0,0 +1,24 @@ +/* + * 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. + */ + +/** + * Foodmart schema, a JDBC schema that many tests query. + */ +@NullMarked +package org.apache.calcite.test.schemata.foodmart; + +import org.jspecify.annotations.NullMarked; 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 f1a7cf47d2ef..44e11fddce4d 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 @@ -45,7 +45,7 @@ public Department(int deptno, String name, List employees, + ", employees: " + employees + ", location: " + location + "]"; } - @Override public boolean equals(Object obj) { + @Override public boolean equals(@Nullable Object obj) { return obj == this || obj instanceof Department && deptno == ((Department) obj).deptno; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Dependent.java b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Dependent.java index d8a04fdb786e..421e0d93a948 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Dependent.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Dependent.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.test.schemata.hr; +import org.jspecify.annotations.Nullable; + import java.util.Objects; /** @@ -34,7 +36,7 @@ public Dependent(int empid, String name) { return "Dependent [empid: " + empid + ", name: " + name + "]"; } - @Override public boolean equals(Object obj) { + @Override public boolean equals(@Nullable Object obj) { return obj == this || obj instanceof Dependent && empid == ((Dependent) obj).empid 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 c3e045df4fc9..0d49383f5e28 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 @@ -44,7 +44,7 @@ public Employee(int empid, int deptno, String name, float salary, + ", name: " + name + "]"; } - @Override public boolean equals(Object obj) { + @Override public boolean equals(@Nullable Object obj) { return obj == this || obj instanceof Employee && empid == ((Employee) obj).empid; 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 269125a83a7f..498ad1b08bba 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 @@ -37,7 +37,7 @@ public Event(int eventid, @Nullable Timestamp ts) { return "Event [eventid: " + eventid + ", ts: " + ts + "]"; } - @Override public boolean equals(Object obj) { + @Override public boolean equals(@Nullable Object obj) { return obj == this || obj instanceof Event && eventid == ((Event) obj).eventid; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/HierarchySchema.java b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/HierarchySchema.java index f6c3eeb66174..dbfd53eec6af 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/HierarchySchema.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/HierarchySchema.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.test.schemata.hr; +import org.jspecify.annotations.Nullable; + import java.util.Arrays; import java.util.Objects; @@ -73,7 +75,7 @@ public Hierarchy(int managerid, int subordinateid) { return "Hierarchy [managerid: " + managerid + ", subordinateid: " + subordinateid + "]"; } - @Override public boolean equals(Object obj) { + @Override public boolean equals(@Nullable Object obj) { return obj == this || obj instanceof Hierarchy && managerid == ((Hierarchy) obj).managerid diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Location.java b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Location.java index 769c61914e9f..d42f657f663c 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Location.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/Location.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.test.schemata.hr; +import org.jspecify.annotations.Nullable; + import java.util.Objects; /** @@ -34,7 +36,7 @@ public Location(int x, int y) { return "Location [x: " + x + ", y: " + y + "]"; } - @Override public boolean equals(Object obj) { + @Override public boolean equals(@Nullable Object obj) { return obj == this || obj instanceof Location && x == ((Location) obj).x 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 d6b87b97f63e..93830513043e 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 @@ -39,7 +39,7 @@ public NullableTest(@Nullable Integer col1, @Nullable Integer col2, return "DependentNullable [col1: " + col1 + ", col2: " + col2 + ", col3: " + col3 + "]"; } - @Override public boolean equals(Object obj) { + @Override public boolean equals(@Nullable Object obj) { return obj == this || obj instanceof NullableTest && Objects.equals(col1, ((NullableTest) obj).col1) diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/hr/package-info.java b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/package-info.java new file mode 100644 index 000000000000..fff89959ca7d --- /dev/null +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/hr/package-info.java @@ -0,0 +1,24 @@ +/* + * 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. + */ + +/** + * HR schema, the small employee-and-department schema most tests query. + */ +@NullMarked +package org.apache.calcite.test.schemata.hr; + +import org.jspecify.annotations.NullMarked; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/lingual/LingualEmp.java b/testkit/src/main/java/org/apache/calcite/test/schemata/lingual/LingualEmp.java index 32509b30c7fb..458661700acf 100644 --- a/testkit/src/main/java/org/apache/calcite/test/schemata/lingual/LingualEmp.java +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/lingual/LingualEmp.java @@ -16,6 +16,8 @@ */ package org.apache.calcite.test.schemata.lingual; +import org.jspecify.annotations.Nullable; + import java.util.Objects; /** @@ -30,7 +32,7 @@ public LingualEmp(int EMPNO, int DEPTNO) { this.DEPTNO = DEPTNO; } - @Override public boolean equals(Object obj) { + @Override public boolean equals(@Nullable Object obj) { return obj == this || obj instanceof LingualEmp && EMPNO == ((LingualEmp) obj).EMPNO; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/lingual/package-info.java b/testkit/src/main/java/org/apache/calcite/test/schemata/lingual/package-info.java new file mode 100644 index 000000000000..f3c5887d5458 --- /dev/null +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/lingual/package-info.java @@ -0,0 +1,24 @@ +/* + * 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. + */ + +/** + * Lingual schema, a variant of the HR schema with nullable columns. + */ +@NullMarked +package org.apache.calcite.test.schemata.lingual; + +import org.jspecify.annotations.NullMarked; 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 0c01004a2d48..c053ca6beaf1 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 @@ -32,24 +32,28 @@ public class InfiniteOrdersTable extends BaseOrderStreamTable implements StreamableTable { @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return Linq4j.asEnumerable(() -> new Iterator() { - private final String[] items = {"paint", "paper", "brush"}; - private int counter = 0; - - @Override public boolean hasNext() { - return true; - } - - @Override public Object[] next() { - final int index = counter++; - return new Object[]{ - System.currentTimeMillis(), index, items[index % items.length], 10}; - } - - @Override public void remove() { - throw new UnsupportedOperationException(); - } - }); + return Linq4j.asEnumerable(InfiniteOrdersIterator::new); + } + + /** Iterator that returns an unbounded stream of orders. */ + private static class InfiniteOrdersIterator + implements Iterator<@Nullable Object[]> { + private final String[] items = {"paint", "paper", "brush"}; + private int counter = 0; + + @Override public boolean hasNext() { + return true; + } + + @Override public @Nullable Object[] next() { + final int index = counter++; + return new Object[]{ + System.currentTimeMillis(), index, items[index % items.length], 10}; + } + + @Override public void remove() { + throw new UnsupportedOperationException(); + } } @Override public Table stream() { 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 dca1a92a5825..81fab52183b4 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 @@ -26,13 +26,13 @@ /** Table representing the history of the ORDERS stream. */ public class OrdersHistoryTable extends BaseOrderStreamTable { - private final ImmutableList rows; + private final ImmutableList<@Nullable Object[]> rows; - public OrdersHistoryTable(ImmutableList rows) { + public OrdersHistoryTable(ImmutableList<@Nullable Object[]> rows) { this.rows = rows; } @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return Linq4j.asEnumerable(rows); + return Linq4j.<@Nullable Object[]>asEnumerable(rows); } } 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 e305ef0a88d8..ca9991c37422 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 @@ -40,7 +40,7 @@ public OrdersStreamTableFactory() { return new OrdersTable(getRowList()); } - public static ImmutableList getRowList() { + public static ImmutableList<@Nullable Object[]> getRowList() { final Object[][] rows = { {ts(10, 15, 0), 1, "paint", 10}, {ts(10, 24, 15), 2, "paper", 5}, @@ -48,7 +48,11 @@ public static ImmutableList getRowList() { {ts(10, 58, 0), 4, "paint", 3}, {ts(11, 10, 0), 5, "paint", 3} }; - return ImmutableList.copyOf(rows); + final ImmutableList.Builder<@Nullable Object[]> list = ImmutableList.builder(); + for (Object[] row : rows) { + list.add(row); + } + return list.build(); } private static Object ts(int h, int m, int s) { 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 36bafa2b990d..022571929f49 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 @@ -34,14 +34,14 @@ */ public class OrdersTable extends BaseOrderStreamTable implements StreamableTable { - private final ImmutableList rows; + private final ImmutableList<@Nullable Object[]> rows; - public OrdersTable(ImmutableList rows) { + public OrdersTable(ImmutableList<@Nullable Object[]> rows) { this.rows = rows; } @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return Linq4j.asEnumerable(rows); + return Linq4j.<@Nullable Object[]>asEnumerable(rows); } @Override public Table 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 b2ef4d259709..286a5d74b215 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 @@ -39,9 +39,9 @@ * Table representing the PRODUCTS relation. */ public class ProductsTable implements ScannableTable { - private final ImmutableList rows; + private final ImmutableList<@Nullable Object[]> rows; - public ProductsTable(ImmutableList rows) { + public ProductsTable(ImmutableList<@Nullable Object[]> rows) { this.rows = rows; } @@ -51,7 +51,7 @@ public ProductsTable(ImmutableList rows) { .build(); @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return Linq4j.asEnumerable(rows); + return Linq4j.<@Nullable Object[]>asEnumerable(rows); } @Override public RelDataType getRowType(RelDataTypeFactory typeFactory) { diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/package-info.java b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/package-info.java new file mode 100644 index 000000000000..feae065c4458 --- /dev/null +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/orderstream/package-info.java @@ -0,0 +1,24 @@ +/* + * 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. + */ + +/** + * Streaming order tables, used by tests that query a stream. + */ +@NullMarked +package org.apache.calcite.test.schemata.orderstream; + +import org.jspecify.annotations.NullMarked; diff --git a/testkit/src/main/java/org/apache/calcite/test/schemata/tpch/package-info.java b/testkit/src/main/java/org/apache/calcite/test/schemata/tpch/package-info.java new file mode 100644 index 000000000000..42822f8dc86b --- /dev/null +++ b/testkit/src/main/java/org/apache/calcite/test/schemata/tpch/package-info.java @@ -0,0 +1,24 @@ +/* + * 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. + */ + +/** + * TPC-H schema, used by tests that plan the TPC-H queries. + */ +@NullMarked +package org.apache.calcite.test.schemata.tpch; + +import org.jspecify.annotations.NullMarked; 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 20e210c7bb22..e4ff258edeae 100644 --- a/testkit/src/main/java/org/apache/calcite/util/Smalls.java +++ b/testkit/src/main/java/org/apache/calcite/util/Smalls.java @@ -213,10 +213,10 @@ public static QueryableTable generateStrings(final Integer count) { int i = 0; int curI; - String curS; + @Nullable String curS; @Override public IntString current() { - return new IntString(curI, curS); + return new IntString(curI, requireNonNull(curS, "curS")); } @Override public boolean moveNext() { @@ -371,25 +371,7 @@ public static ScannableTable dummyTableFuncWithTwoParams(final long param1, fina } @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { - return new Enumerator() { - @Override public Object[] current() { - return new Object[] {}; - } - - @Override public boolean moveNext() { - return false; - } - - @Override public void reset() { - } - - @Override public void close() { - } - }; - } - }; + return Linq4j.emptyEnumerable(); } @Override public Statistic getStatistic() { @@ -420,36 +402,7 @@ public static ScannableTable fibonacciTableWithLimit(final long limit) { } @Override public Enumerable<@Nullable Object[]> scan(DataContext root) { - return new AbstractEnumerable() { - @Override public Enumerator enumerator() { - return new Enumerator() { - private long prev = 1; - private long current = 0; - - @Override public Object[] current() { - return new Object[] {current}; - } - - @Override public boolean moveNext() { - final long next = current + prev; - if (limit >= 0 && next > limit) { - return false; - } - prev = current; - current = next; - return true; - } - - @Override public void reset() { - prev = 0; - current = 1; - } - - @Override public void close() { - } - }; - } - }; + return new FibonacciEnumerable(limit); } @Override public Statistic getStatistic() { @@ -622,7 +575,7 @@ public MyPlusInitFunction(FunctionContext fx) { } THREAD_DIGEST.set(b.toString()); this.initY = fx.isArgumentConstant(1) - ? fx.getArgumentValueAs(1, Integer.class) + ? requireNonNull(fx.getArgumentValueAs(1, Integer.class), "y") : 100; } @@ -641,8 +594,8 @@ public static class MyDeterministicPlusFunction { INSTANCE_COUNT.get().incrementAndGet(); } - public Integer eval(@Parameter(name = "x") Integer x, - @Parameter(name = "y") Integer y) { + public @Nullable Integer eval(@Parameter(name = "x") @Nullable Integer x, + @Parameter(name = "y") @Nullable Integer y) { if (x == null || y == null) { return null; } @@ -683,7 +636,8 @@ public static String eval(@Parameter(name = "o") Object o) { /** Example of a semi-strict UDF. * (Returns null if its parameter is null or if its length is 4.) */ public static class Null4Function { - @SemiStrict public static String eval(@Parameter(name = "s") String s) { + @SemiStrict public static @Nullable String eval( + @Parameter(name = "s") @Nullable String s) { if (s == null || s.length() == 4) { return null; } @@ -695,7 +649,8 @@ public static class Null4Function { * Throws {@link NullPointerException} if argument is null. * Returns null if its argument's length is 8. */ public static class Null8Function { - @SemiStrict public static String eval(@Parameter(name = "s") String s) { + @SemiStrict public static @Nullable String eval( + @Parameter(name = "s") String s) { if (s.length() == 8) { return null; } @@ -857,29 +812,30 @@ public static java.sql.Date toDateFun(int v) { return SqlFunctions.internalToDate(v); } - public static java.sql.Date toDateFun(Long v) { + public static java.sql.@Nullable Date toDateFun(@Nullable Long v) { return v == null ? null : SqlFunctions.internalToDate(v.intValue()); } public static java.sql.Timestamp toTimestampFun(Long v) { return SqlFunctions.internalToTimestamp(v); } - public static java.sql.Time toTimeFun(Long v) { + public static java.sql.@Nullable Time toTimeFun(@Nullable Long v) { return v == null ? null : SqlFunctions.internalToTime(v.intValue()); } /** For overloaded user-defined functions that have {@code double} and * {@code BigDecimal} arguments will go wrong. */ - public static double toDouble(BigDecimal var) { + public static double toDouble(@Nullable BigDecimal var) { return var == null ? 0.0d : var.doubleValue(); } - public static double toDouble(Double var) { + public static double toDouble(@Nullable Double var) { return var == null ? 0.0d : var; } - public static double toDouble(Float var) { + public static double toDouble(@Nullable Float var) { return var == null ? 0.0d : Double.valueOf(var.toString()); } - public static List arrayAppendFun(List v, Integer i) { + public static @Nullable List arrayAppendFun(@Nullable List v, + @Nullable Integer i) { if (v == null || i == null) { return null; } else { @@ -1473,7 +1429,7 @@ public static class SimpleTable extends AbstractQueryableTable implements TranslatableTable { private final String[] columnNames = { "A", "B" }; private final Class[] columnTypes = { String.class, Integer.class }; - private final Object[][] rows = new Object[3][]; + private final @Nullable Object[][] rows = new @Nullable Object[3][]; public SimpleTable() { super(Object[].class); @@ -1495,11 +1451,11 @@ public SimpleTable() { return typeFactory.createStructType(columnDesc); } - public Iterator iterator() { + public Iterator<@Nullable Object[]> iterator() { return Linq4j.enumeratorIterator(enumerator()); } - public Enumerator enumerator() { + public Enumerator<@Nullable Object[]> enumerator() { return enumeratorImpl(null); } @@ -1514,43 +1470,54 @@ public Enumerator enumerator() { }; } - private Enumerator enumeratorImpl(final int[] fields) { - return new Enumerator() { - private Object[] current; - private final Iterator iterator = Arrays.asList(rows) - .iterator(); + private Enumerator<@Nullable Object[]> enumeratorImpl( + final int @Nullable [] fields) { + return new SimpleEnumerator(rows, fields); + } - @Override public Object[] current() { - return current; - } + /** Enumerator over the rows of a {@link SimpleTable}. */ + private static class SimpleEnumerator + implements Enumerator<@Nullable Object[]> { + private final int @Nullable [] fields; + private final Iterator<@Nullable Object[]> iterator; + private @Nullable Object @Nullable [] current; - @Override public boolean moveNext() { - if (iterator.hasNext()) { - Object[] full = iterator.next(); - current = fields != null ? convertRow(full) : full; - return true; - } else { - current = null; - return false; - } - } + SimpleEnumerator(@Nullable Object[][] rows, int @Nullable [] fields) { + this.fields = fields; + this.iterator = Arrays.asList(rows).iterator(); + } - @Override public void reset() { - throw new UnsupportedOperationException(); - } + @Override public @Nullable Object[] current() { + return requireNonNull(current, "current"); + } - @Override public void close() { - // noop + @Override public boolean moveNext() { + if (iterator.hasNext()) { + @Nullable Object[] full = iterator.next(); + current = fields != null ? convertRow(full, fields) : full; + return true; + } else { + current = null; + return false; } + } - private Object[] convertRow(Object[] full) { - final Object[] objects = new Object[fields.length]; - for (int i = 0; i < fields.length; i++) { - objects[i] = full[fields[i]]; - } - return objects; + @Override public void reset() { + throw new UnsupportedOperationException(); + } + + @Override public void close() { + // noop + } + + private static @Nullable Object[] convertRow(@Nullable Object[] full, + int[] fields) { + final @Nullable Object[] objects = new Object[fields.length]; + for (int i = 0; i < fields.length; i++) { + objects[i] = full[fields[i]]; } - }; + return objects; + } } @Override public RelNode toRel( @@ -1573,7 +1540,7 @@ private Object[] convertRow(Object[] full) { /** User-defined function that decodes a Base64 string to bytes. */ public static class MyUnbase64Function { - public static ByteString eval(String s) { + public static @Nullable ByteString eval(@Nullable String s) { if (s == null) { return null; } @@ -1603,7 +1570,7 @@ public static int eval(byte[] bytes) { /** User-defined function with return type Character[]. */ public static class CharacterArrayFunction { - public static Character[] eval(String s) { + public static Character @Nullable [] eval(@Nullable String s) { if (s == null) { return null; } @@ -1614,4 +1581,53 @@ public static Character[] eval(String s) { return characters; } } + + /** Enumerable over the Fibonacci numbers up to a limit. */ + private static class FibonacciEnumerable + extends AbstractEnumerable<@Nullable Object[]> { + private final long limit; + + FibonacciEnumerable(long limit) { + this.limit = limit; + } + + @Override public Enumerator<@Nullable Object[]> enumerator() { + return new FibonacciEnumerator(limit); + } + } + + /** Enumerator over the Fibonacci numbers up to a limit. */ + private static class FibonacciEnumerator + implements Enumerator<@Nullable Object[]> { + private final long limit; + private long prev = 1; + private long current = 0; + + FibonacciEnumerator(long limit) { + this.limit = limit; + } + + @Override public @Nullable Object[] current() { + return new Object[] {current}; + } + + @Override public boolean moveNext() { + final long next = current + prev; + if (limit >= 0 && next > limit) { + return false; + } + prev = current; + current = next; + return true; + } + + @Override public void reset() { + prev = 0; + current = 1; + } + + @Override public void close() { + } + } + } diff --git a/testkit/src/main/java/org/apache/calcite/util/TestUtil.java b/testkit/src/main/java/org/apache/calcite/util/TestUtil.java index f8e4e60f2c95..c997a5cb0fd4 100644 --- a/testkit/src/main/java/org/apache/calcite/util/TestUtil.java +++ b/testkit/src/main/java/org/apache/calcite/util/TestUtil.java @@ -20,6 +20,7 @@ import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableSortedSet; +import org.jspecify.annotations.Nullable; import org.junit.jupiter.api.Assertions; import java.io.File; @@ -59,10 +60,12 @@ public abstract class TestUtil { "\\\\n\"" + Util.LINE_SEPARATOR + " + \""; private static final String JAVA_VERSION = - System.getProperties().getProperty("java.version"); + requireNonNull(System.getProperties().getProperty("java.version"), + "java.version"); public static final Version AVATICA_VERSION = - Version.of(first(System.getProperty("calcite.avatica.version"), "0")); + Version.of( + first(System.getProperty("calcite.avatica.version"), "0")); private static final Supplier GUAVA_MAJOR_VERSION = Suppliers.memoize(TestUtil::computeGuavaMajorVersion); @@ -245,11 +248,11 @@ public static String correctRoundedFloat(String s) { } final Matcher m = TRAILING_ZERO_PATTERN.matcher(s); if (m.matches()) { - s = s.substring(0, s.length() - m.group(2).length()); + s = s.substring(0, s.length() - requireNonNull(m.group(2), "group").length()); } final Matcher m2 = TRAILING_NINE_PATTERN.matcher(s); if (m2.matches()) { - s = s.substring(0, s.length() - m2.group(2).length()); + s = s.substring(0, s.length() - requireNonNull(m2.group(2), "group").length()); if (s.length() > 0) { final char c = s.charAt(s.length() - 1); switch (c) { @@ -304,7 +307,7 @@ static int majorVersionFromString(String version) { throw new IllegalArgumentException("Can't parse (detect) JDK version from " + version); } - return parseInt(matcher.group()); + return parseInt(requireNonNull(matcher.group(), "version")); } /** Returns the Guava major version. */ @@ -328,7 +331,7 @@ private static int computeGuavaMajorVersion() { } /** Returns the JVM vendor. */ - public static String getJavaVirtualMachineVendor() { + public static @Nullable String getJavaVirtualMachineVendor() { return System.getProperty("java.vm.vendor"); } @@ -343,19 +346,18 @@ public static File getBaseDir(Class klass) { Sources.of(requireNonNull(resource, "resource")).file(); File file = classFile.getAbsoluteFile(); - for (int i = 0; i < 42; i++) { - if (isProjectDir(file)) { - // Ok, file == BASE/testkit/ - break; - } - file = file.getParentFile(); + for (int i = 0; i < 42 && !isProjectDir(file); i++) { + file = + requireNonNull(file.getParentFile(), + () -> "no project directory above " + + classFile.getAbsolutePath()); } if (!isProjectDir(file)) { fail("Could not find pom.xml, build.gradle.kts or gradle.properties. " + "Started with " + classFile.getAbsolutePath() + ", the current path is " + file.getAbsolutePath()); } - return file.getParentFile(); + return requireNonNull(file.getParentFile(), "parent of project directory"); } private static boolean isProjectDir(File dir) { diff --git a/testkit/src/main/java/org/apache/calcite/util/package-info.java b/testkit/src/main/java/org/apache/calcite/util/package-info.java index d1fa6d454499..61c0b0329929 100644 --- a/testkit/src/main/java/org/apache/calcite/util/package-info.java +++ b/testkit/src/main/java/org/apache/calcite/util/package-info.java @@ -18,4 +18,7 @@ /** * Classes for testing Calcite. */ +@NullMarked package org.apache.calcite.util; + +import org.jspecify.annotations.NullMarked; From 7dd017813d75865ed419806ddfe0b33020e1d70a Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Wed, 26 Aug 2026 08:52:48 +0300 Subject: [PATCH 60/60] [CALCITE-7736] Put :ubenchmark under nullness verification The benchmarks keep their sources in the jmh source set rather than a main one, so the verification follows them there, and the errorprone CI job builds jmhClasses alongside classes. A JMH state class is filled in by the @Setup methods and the @Param values, which is what NullAway.Init says; the rest is the usual: a statistics map that a phase may not have produced, an employee with no commission, and an edge the graph may not hold. Two Error Prone warnings that the jmh source set had never been built against are fixed rather than suppressed: a helper that reads no instance state is static, and a parse failure during setup is thrown rather than printed. Co-Authored-By: Claude Opus 5 --- .github/workflows/main.yml | 2 +- .../enumerable/CodeGenerationBenchmark.java | 15 ++++++- .../adapter/enumerable/package-info.java | 3 ++ ...bstractRelNodeGetRelTypeNameBenchmark.java | 8 +++- .../DefaultDirectedGraphBenchmark.java | 8 ++-- .../benchmarks/LargePlanBenchmark.java | 40 ++++++++++++------- .../calcite/benchmarks/MetadataBenchmark.java | 1 + .../calcite/benchmarks/ParserBenchmark.java | 1 + .../ParserInstantiationBenchmark.java | 1 + .../calcite/benchmarks/PreconditionTest.java | 1 + .../RelNodeConversionBenchmark.java | 5 ++- .../calcite/benchmarks/StatementTest.java | 16 +++++--- .../benchmarks/StringConstructBenchmark.java | 2 + .../benchmarks/TypeDigestBenchmark.java | 3 +- .../calcite/benchmarks/package-info.java | 3 ++ 15 files changed, 80 insertions(+), 29 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index de8ef5f4b8db..035b8724b868 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -363,7 +363,7 @@ jobs: job-id: errprone remote-build-cache-proxy-enabled: false # ErrorProne checks for Beta APIs, so use the latest supported Guava version - arguments: --scan --no-parallel --no-daemon -Pguava.version=${{ env.GUAVA_MAX }} -PenableErrorprone classes + arguments: --scan --no-parallel --no-daemon -Pguava.version=${{ env.GUAVA_MAX }} -PenableErrorprone classes jmhClasses linux-slow: # Run slow tests when the commit is on main or it is requested explicitly by adding an diff --git a/ubenchmark/src/jmh/java/org/apache/calcite/adapter/enumerable/CodeGenerationBenchmark.java b/ubenchmark/src/jmh/java/org/apache/calcite/adapter/enumerable/CodeGenerationBenchmark.java index 22c745dd8f86..7c3f899e8a91 100644 --- a/ubenchmark/src/jmh/java/org/apache/calcite/adapter/enumerable/CodeGenerationBenchmark.java +++ b/ubenchmark/src/jmh/java/org/apache/calcite/adapter/enumerable/CodeGenerationBenchmark.java @@ -89,6 +89,7 @@ public class CodeGenerationBenchmark { * exploited by the embedded compiler in order to dynamically build a Java class. */ @State(Scope.Thread) + @SuppressWarnings("NullAway.Init") // JMH sets the fields via @Setup and @Param public static class QueryState { /** * The number of distinct queries to be generated. @@ -111,8 +112,12 @@ public static class QueryState { /** * The necessary plan information for every generated query. */ + /** Set by the {@code @Setup} method that JMH calls before the trial. */ + @SuppressWarnings("NullAway.Init") PlanInfo[] planInfos; + /** Set by the {@code @Setup} method that JMH calls before the trial. */ + @SuppressWarnings("NullAway.Init") ICompilerFactory compilerFactory; private int currentPlan = 0; @@ -222,7 +227,11 @@ int nextPlan() { } } - /** Plan information. */ + /** Plan information. + * + *

    Every field is filled in as the plan is built, which is why they are + * not initialized here. */ + @SuppressWarnings("NullAway.Init") private static class PlanInfo { ClassDeclaration classExpr; EnumerableRel plan; @@ -234,10 +243,14 @@ private static class PlanInfo { * once at the beginning of each iteration. */ @State(Scope.Thread) + @SuppressWarnings("NullAway.Init") // JMH sets the fields via @Setup and @Param public static class CacheState { @Param({"10", "100", "1000"}) int cacheSize; + /** Set by the {@code @Setup} method that JMH calls before each + * iteration. */ + @SuppressWarnings("NullAway.Init") Cache cache; @Setup(Level.Iteration) diff --git a/ubenchmark/src/jmh/java/org/apache/calcite/adapter/enumerable/package-info.java b/ubenchmark/src/jmh/java/org/apache/calcite/adapter/enumerable/package-info.java index 9bfc9122dee4..4e22e37c8cac 100644 --- a/ubenchmark/src/jmh/java/org/apache/calcite/adapter/enumerable/package-info.java +++ b/ubenchmark/src/jmh/java/org/apache/calcite/adapter/enumerable/package-info.java @@ -18,4 +18,7 @@ /** * Benchmarks for Enumerable adapter. */ +@NullMarked package org.apache.calcite.adapter.enumerable; + +import org.jspecify.annotations.NullMarked; diff --git a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/AbstractRelNodeGetRelTypeNameBenchmark.java b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/AbstractRelNodeGetRelTypeNameBenchmark.java index 5ff669c2c265..93f3ae83fbed 100644 --- a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/AbstractRelNodeGetRelTypeNameBenchmark.java +++ b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/AbstractRelNodeGetRelTypeNameBenchmark.java @@ -18,6 +18,7 @@ import org.apache.calcite.rel.AbstractRelNode; +import org.jspecify.annotations.Nullable; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; @@ -39,6 +40,8 @@ import java.util.Random; import java.util.concurrent.TimeUnit; +import static java.util.Objects.requireNonNull; + /** * A benchmark of alternative implementations for {@link AbstractRelNode#getRelTypeName()} * method. @@ -56,6 +59,7 @@ public class AbstractRelNodeGetRelTypeNameBenchmark { * {@link org.apache.calcite.rel.RelNode} interface. */ @State(Scope.Thread) + @SuppressWarnings("NullAway.Init") // JMH sets the fields via @Setup and @Param public static class ClassNameState { private final String[] fullNames = new String[]{ @@ -185,7 +189,7 @@ public static class ClassNameState { @Param({"11", "31", "63"}) private long seed; - private Random r = null; + private @Nullable Random r = null; /** * Sets up the random number generator at the beginning of each iteration. @@ -203,7 +207,7 @@ public void setupRandom() { * interface. */ public String nextName() { - return fullNames[r.nextInt(fullNames.length)]; + return fullNames[requireNonNull(r, "r").nextInt(fullNames.length)]; } } diff --git a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/DefaultDirectedGraphBenchmark.java b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/DefaultDirectedGraphBenchmark.java index 85b9f494b573..3446ffd1bb50 100644 --- a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/DefaultDirectedGraphBenchmark.java +++ b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/DefaultDirectedGraphBenchmark.java @@ -22,6 +22,7 @@ import com.google.common.collect.Lists; +import org.jspecify.annotations.Nullable; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Level; @@ -53,7 +54,7 @@ private Node(int id) { this.id = id; } - @Override public boolean equals(Object o) { + @Override public boolean equals(@Nullable Object o) { return o == this || o instanceof Node && ((Node) o).id == id; @@ -68,6 +69,7 @@ private Node(int id) { * State object for the benchmarks. */ @State(Scope.Benchmark) + @SuppressWarnings("NullAway.Init") // JMH sets the fields via @Setup and @Param public static class GraphState { static final int NUM_LAYERS = 8; @@ -182,14 +184,14 @@ public boolean addVertexBenchmark(GraphState state) { @Benchmark @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MICROSECONDS) - public DefaultEdge addEdgeBenchmark(GraphState state) { + public @Nullable DefaultEdge addEdgeBenchmark(GraphState state) { return state.graph.addEdge(state.nodes.get(0), state.nodes.get(5)); } @Benchmark @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MICROSECONDS) - public DefaultEdge getEdgeBenchmark(GraphState state) { + public @Nullable DefaultEdge getEdgeBenchmark(GraphState state) { return state.graph.getEdge(state.nodes.get(0), state.nodes.get(1)); } diff --git a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/LargePlanBenchmark.java b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/LargePlanBenchmark.java index 91455da17263..bc17a091d1a3 100644 --- a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/LargePlanBenchmark.java +++ b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/LargePlanBenchmark.java @@ -33,6 +33,7 @@ import com.google.common.collect.ImmutableList; +import org.jspecify.annotations.Nullable; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; @@ -55,6 +56,8 @@ import java.util.Map; import java.util.concurrent.TimeUnit; +import static java.util.Objects.requireNonNull; + /** * Benchmark that constructs a synthetic query plan consisting of a large plan. * @@ -75,6 +78,7 @@ @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Thread) @Threads(1) +@SuppressWarnings("NullAway.Init") // JMH sets the fields via @Setup and @Param public class LargePlanBenchmark { @Param({"100", "1000", "10000", "100000"}) @@ -82,6 +86,7 @@ public class LargePlanBenchmark { // For large plans, "DEPTH_FIRST", "BOTTOM_UP", and "TOP_DOWN" are slower than ARBITRARY @Param({"ARBITRARY"}) + @SuppressWarnings("NullAway.Init") // set by JMH from the @Param values String matchOrder; // Enable validation mode to verify rule application counts across different orders. @@ -89,6 +94,7 @@ public class LargePlanBenchmark { boolean isLargePlanMode = true; // false is very slow in 10000 unions boolean isEnableFiredRulesCache = true; + @SuppressWarnings("NullAway.Init") // set by the @Setup method private static RelBuilder builder; // All available match orders for validation @@ -227,22 +233,24 @@ public Map>> testLargeUnionPlan( planner.setRoot(root); // Phase 1: Execute FILTER_REDUCE_EXPRESSIONS - Map> beforeFilter = + @Nullable Map> beforeFilter = collectStats ? snapshotRuleAttempts(planner) : null; planner.executeProgram(filterReduce); if (collectStats) { stats.put("FILTER", - subtractRuleAttempts(snapshotRuleAttempts(planner), beforeFilter)); + subtractRuleAttempts(snapshotRuleAttempts(planner), + requireNonNull(beforeFilter, "beforeFilter"))); } planner.clearRules(); // Phase 2: Execute PROJECT_REDUCE_EXPRESSIONS - Map> beforeProject = + @Nullable Map> beforeProject = collectStats ? snapshotRuleAttempts(planner) : null; planner.executeProgram(projectReduce); if (collectStats) { stats.put("PROJECT", - subtractRuleAttempts(snapshotRuleAttempts(planner), beforeProject)); + subtractRuleAttempts(snapshotRuleAttempts(planner), + requireNonNull(beforeProject, "beforeProject"))); } planner.clearRules(); @@ -299,7 +307,7 @@ public void runValidation() { boolean allPassed = true; Map>>> baselineStats = - allStats.get("ARBITRARY"); + requireNonNull(allStats.get("ARBITRARY"), "ARBITRARY"); for (String order : ALL_MATCH_ORDERS) { if (order.equals("ARBITRARY")) { @@ -308,11 +316,13 @@ public void runValidation() { System.out.println("Comparing " + order + " against ARBITRARY:"); Map>>> orderStats = - allStats.get(order); + requireNonNull(allStats.get(order), order); for (int size : VALIDATION_SIZES) { boolean sizePassed = - validateSizeStats(order, size, baselineStats.get(size), orderStats.get(size)); + validateSizeStats(order, size, + requireNonNull(baselineStats.get(size), "baseline"), + requireNonNull(orderStats.get(size), "order")); if (!sizePassed) { allPassed = false; } @@ -344,14 +354,16 @@ private boolean validateSizeStats(String order, int size, StringBuilder sb = new StringBuilder(); sb.append(String.format(Locale.ROOT, " Size %4d: ", size)); - Map> baselineFilter = baseline.get("FILTER"); - Map> testFilter = test.get("FILTER"); + @Nullable Map> baselineFilter = + baseline.get("FILTER"); + @Nullable Map> testFilter = test.get("FILTER"); if (!comparePhaseStats("FILTER", baselineFilter, testFilter, sb)) { passed = false; } - Map> baselineProject = baseline.get("PROJECT"); - Map> testProject = test.get("PROJECT"); + @Nullable Map> baselineProject = + baseline.get("PROJECT"); + @Nullable Map> testProject = test.get("PROJECT"); if (!comparePhaseStats("PROJECT", baselineProject, testProject, sb)) { passed = false; } @@ -366,8 +378,8 @@ private boolean validateSizeStats(String order, int size, } private boolean comparePhaseStats(String phase, - Map> baseline, - Map> test, + @Nullable Map> baseline, + @Nullable Map> test, StringBuilder sb) { if (baseline == null && test == null) { @@ -450,7 +462,7 @@ public void runBenchmark() { for (String order : ALL_MATCH_ORDERS) { System.out.println("Testing match order: " + order); - int[] sizes = orderSizes.get(order); + int[] sizes = requireNonNull(orderSizes.get(order), order); for (int size : sizes) { int nodeCount = 4 * size + 3; diff --git a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/MetadataBenchmark.java b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/MetadataBenchmark.java index dece4c9aff93..2f357c3c1578 100644 --- a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/MetadataBenchmark.java +++ b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/MetadataBenchmark.java @@ -55,6 +55,7 @@ @Threads(1) @OutputTimeUnit(TimeUnit.MILLISECONDS) @BenchmarkMode(Mode.AverageTime) +@SuppressWarnings("NullAway.Init") // JMH sets the fields via @Setup and @Param public class MetadataBenchmark { @Setup diff --git a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/ParserBenchmark.java b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/ParserBenchmark.java index b39905e25dac..77cd8b929fab 100644 --- a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/ParserBenchmark.java +++ b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/ParserBenchmark.java @@ -51,6 +51,7 @@ @Threads(1) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MICROSECONDS) +@SuppressWarnings("NullAway.Init") // JMH sets the fields via @Setup and @Param public class ParserBenchmark { @Param({ "1000" }) diff --git a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/ParserInstantiationBenchmark.java b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/ParserInstantiationBenchmark.java index bb804bbf9f31..264c36ef114e 100644 --- a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/ParserInstantiationBenchmark.java +++ b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/ParserInstantiationBenchmark.java @@ -50,6 +50,7 @@ @Threads(1) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MICROSECONDS) +@SuppressWarnings("NullAway.Init") // JMH sets the fields via @Setup and @Param public class ParserInstantiationBenchmark { @Param({"0", "100"}) diff --git a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/PreconditionTest.java b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/PreconditionTest.java index e4975dd2c8e2..c005590f7f1b 100644 --- a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/PreconditionTest.java +++ b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/PreconditionTest.java @@ -34,6 +34,7 @@ */ @BenchmarkMode(Mode.AverageTime) @State(Scope.Benchmark) +@SuppressWarnings("NullAway.Init") // JMH sets the fields via @Setup and @Param public class PreconditionTest { boolean fire = true; String param = "world"; diff --git a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/RelNodeConversionBenchmark.java b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/RelNodeConversionBenchmark.java index cbabec73c1fb..17fb5d4db09f 100644 --- a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/RelNodeConversionBenchmark.java +++ b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/RelNodeConversionBenchmark.java @@ -71,6 +71,7 @@ @OutputTimeUnit(TimeUnit.MILLISECONDS) @State(Scope.Benchmark) @Threads(1) +@SuppressWarnings("NullAway.Init") // JMH sets the fields via @Setup and @Param public class RelNodeConversionBenchmark { /** @@ -134,6 +135,7 @@ public void setup(int length, int columnLength) { * A state holding information needed to parse. */ @State(Scope.Thread) + @SuppressWarnings("NullAway.Init") // JMH sets the fields via @Setup and @Param public static class SqlToRelNodeBenchmarkState extends RelNodeConversionBenchmarkState { @Param({"10000"}) int length; @@ -165,6 +167,7 @@ public RelNode parse(SqlToRelNodeBenchmarkState state) throws Exception { * A state holding information needed to convert To Rel. */ @State(Scope.Thread) + @SuppressWarnings("NullAway.Init") // JMH sets the fields via @Setup and @Param public static class SqlNodeToRelNodeBenchmarkState extends RelNodeConversionBenchmarkState { @Param({"10000"}) int length; @@ -179,7 +182,7 @@ public void setUp() { try { sqlNode = p.validate(p.parse(sql)); } catch (Exception e) { - e.printStackTrace(); + throw new RuntimeException("while parsing " + sql, e); } } diff --git a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/StatementTest.java b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/StatementTest.java index c93486080eb9..9f5fbc2b11d0 100644 --- a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/StatementTest.java +++ b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/StatementTest.java @@ -20,6 +20,7 @@ import org.apache.calcite.jdbc.CalciteConnection; import org.apache.calcite.schema.SchemaPlus; +import org.jspecify.annotations.Nullable; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Level; @@ -40,6 +41,8 @@ import java.util.Properties; import java.util.Random; +import static org.apache.calcite.linq4j.Nullness.castNonNull; + /** * Compares {@link java.sql.Statement} vs {@link java.sql.PreparedStatement}. * @@ -66,6 +69,7 @@ public class StatementTest { */ @State(Scope.Thread) @BenchmarkMode(Mode.AverageTime) + @SuppressWarnings("NullAway.Init") // JMH sets the fields via @Setup and @Param public static class HrConnection { final Connection con; int id; @@ -124,7 +128,7 @@ public static class HrPreparedStatement extends HrConnection { } @Benchmark - public String prepareBindExecute(HrConnection state) throws SQLException { + public @Nullable String prepareBindExecute(HrConnection state) throws SQLException { Connection con = state.con; Statement st = null; ResultSet rs = null; @@ -144,7 +148,7 @@ public String prepareBindExecute(HrConnection state) throws SQLException { } @Benchmark - public String bindExecute(HrPreparedStatement state) + public @Nullable String bindExecute(HrPreparedStatement state) throws SQLException { PreparedStatement st = state.ps; ResultSet rs = null; @@ -161,7 +165,7 @@ public String bindExecute(HrPreparedStatement state) } @Benchmark - public String executeQuery(HrConnection state) throws SQLException { + public @Nullable String executeQuery(HrConnection state) throws SQLException { Connection con = state.con; Statement st = null; ResultSet rs = null; @@ -178,7 +182,7 @@ public String executeQuery(HrConnection state) throws SQLException { } @Benchmark - public String forEach(HrConnection state) { + public @Nullable String forEach(HrConnection state) { final Employee[] emps = state.hr.emps; for (Employee emp : emps) { if (emp.empid == state.id) { @@ -188,7 +192,7 @@ public String forEach(HrConnection state) { return null; } - private static void close(ResultSet rs, Statement st) { + private static void close(@Nullable ResultSet rs, @Nullable Statement st) { if (rs != null) { try { rs.close(); @@ -214,7 +218,7 @@ public static class HrSchema { public final Employee[] emps = { new Employee(100, 10, "Bill", 10000, 1000), new Employee(200, 20, "Eric", 8000, 500), - new Employee(150, 10, "Sebastian", 7000, null), + new Employee(150, 10, "Sebastian", 7000, castNonNull(null)), new Employee(110, 10, "Theodore", 11500, 250), }; public final Department[] depts = { diff --git a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/StringConstructBenchmark.java b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/StringConstructBenchmark.java index 53ca532f1cd8..f9669986de44 100644 --- a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/StringConstructBenchmark.java +++ b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/StringConstructBenchmark.java @@ -61,6 +61,7 @@ public class StringConstructBenchmark { * benchmark. */ @State(Scope.Thread) + @SuppressWarnings("NullAway.Init") // JMH sets the fields via @Setup and @Param public static class WriterState { public Writer writer; @@ -75,6 +76,7 @@ public void setup() { * operations. */ @State(Scope.Thread) + @SuppressWarnings("NullAway.Init") // JMH sets the fields via @Setup and @Param public static class AppenderState { /** * The type of the appender to be initialised. diff --git a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/TypeDigestBenchmark.java b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/TypeDigestBenchmark.java index a02a6e836a0b..ac516e6166c9 100644 --- a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/TypeDigestBenchmark.java +++ b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/TypeDigestBenchmark.java @@ -54,6 +54,7 @@ @OutputTimeUnit(TimeUnit.MICROSECONDS) @State(Scope.Thread) @Threads(1) +@SuppressWarnings("NullAway.Init") // JMH sets the fields via @Setup and @Param public class TypeDigestBenchmark { @Param({"1", "50", "500", "5000", "50000"}) @@ -68,7 +69,7 @@ public void setup() { type2 = createType(topN); } - private RelDataType createType(int n) { + private static RelDataType createType(int n) { RelBuilder builder = RelBuilder.create(Frameworks.newConfigBuilder() .defaultSchema(Frameworks.createRootSchema(true)) diff --git a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/package-info.java b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/package-info.java index 37d29d443ab0..c11a890b1b7b 100644 --- a/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/package-info.java +++ b/ubenchmark/src/jmh/java/org/apache/calcite/benchmarks/package-info.java @@ -18,4 +18,7 @@ /** * JMH benchmarks for Calcite. */ +@NullMarked package org.apache.calcite.benchmarks; + +import org.jspecify.annotations.NullMarked;