apache/druid · critical · ISE

set to 'true', but has been removed, see for details for…

Error message

%s set to 'true', but has been removed, see %s for details for how to migrate to SQL compliant behavior

What it means

The legacy null-handling toggle druid.query.defaultNullValue has been removed from Druid. StartupInjectorBuilder.validate() refuses startup with an ISE if the property is still set to 'true', directing users to the ANSI SQL null-handling migration doc for the version in use.

Solutions

  1. Remove the property (set only valid values or delete the line) from runtime properties
  2. Follow the migration guide at the docs link in the error (release-info/migr-ansi-sql-null) to adapt queries to SQL-compliant NULL behavior
  3. Test queries that relied on the old default-null substitution behavior and adjust them (e.g. COALESCE) before/after upgrading

Example fix

// before (runtime.properties)
druid.query.defaultNullValue=true
// after
# property removed entirely
Defensive patterns

Strategy: validation

Validate before calling

String v = props.getProperty("druid.query.defaultNullValue");
if ("true".equalsIgnoreCase(v)) throw new IllegalStateException("Removed config druid.query.defaultNullValue=true; migrate per druid.apache.org docs");

Try / catch

try { injector = StartupInjectorBuilder.build(); } catch (ISE e) { if (e.getMessage().contains("has been removed")) log.error("Remove legacy null-handling config; see migration doc"); throw e; }

Prevention

When it happens

Trigger: validate() parses properties.getProperty(NULL_HANDLING_CONFIG_STRING, "false") during injector startup; any occurrence of the removed key set to 'true' in runtime properties triggers the throw.

Common situations: Upgrading Druid from a pre-ANSI-SQL version to a recent one while keeping old common.runtime.properties; copied config templates that still carry the removed flag.

Related errors


AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07). Data as JSON: /api/errors/16128a0c2d3b2148. Report an issue: GitHub.

Appendix: source

Thrown at processing/src/main/java/org/apache/druid/guice/StartupInjectorBuilder.java:142

   */
  private static final class PropertiesValidator
  {
    private final Properties properties;

    @Inject
    public PropertiesValidator(Properties properties)
    {
      this.properties = properties;
    }

    public void validate()
    {
      final boolean defaultValueMode = Boolean.parseBoolean(
          properties.getProperty(NULL_HANDLING_CONFIG_STRING, "false")
      );
      if (defaultValueMode) {
        final String docsLink = StringUtils.format("https://druid.apache.org/docs/%s/release-info/migr-ansi-sql-null", getVersionString());
        throw new ISE(
            "%s set to 'true', but has been removed, see %s for details for how to migrate to SQL compliant behavior",
            NULL_HANDLING_CONFIG_STRING,
            docsLink
        );
      }

      final boolean no3vl = !Boolean.parseBoolean(
          properties.getProperty(THREE_VALUE_LOGIC_CONFIG_STRING, "true")
      );
      if (no3vl) {
        final String docsLink = StringUtils.format("https://druid.apache.org/docs/%s/release-info/migr-ansi-sql-null", getVersionString());
        throw new ISE(
            "%s set to 'false', but has been removed, see %s for details for how to migrate to SQL compliant behavior",
            THREE_VALUE_LOGIC_CONFIG_STRING,
            docsLink
        );
      }

View on GitHub (pinned to 9b90983fd2)