prestodb/presto · error · ConfigurationException

Only one of 'case-insensitive-name-matching=true' or 'case-s

Error message

Only one of 'case-insensitive-name-matching=true' or 'case-sensitive-name-matching=true' can be set. These options are mutually exclusive.

What it means

BaseJdbcConfig.validateConfig() (@PostConstruct) enforces that the legacy case-insensitive-name-matching and the newer case-sensitive-name-matching options are not both enabled, since they are mutually exclusive. Both set to true makes the connector configuration invalid at catalog load.

Source

Thrown at presto-base-jdbc/src/main/java/com/facebook/presto/plugin/jdbc/BaseJdbcConfig.java:189

    public boolean isCaseSensitiveNameMatching()
    {
        return caseSensitiveNameMatchingEnabled;
    }

    @Config("case-sensitive-name-matching")
    @ConfigDescription("Enable case-sensitive matching of schema, table names across the connector. " +
            "When disabled, names are matched case-insensitively using lowercase normalization.")
    public BaseJdbcConfig setCaseSensitiveNameMatching(boolean caseSensitiveNameMatchingEnabled)
    {
        this.caseSensitiveNameMatchingEnabled = caseSensitiveNameMatchingEnabled;
        return this;
    }

    @PostConstruct
    public void validateConfig()
    {
        if (isCaseInsensitiveNameMatching() && isCaseSensitiveNameMatching()) {
            throw new ConfigurationException(ImmutableList.of(new Message("Only one of 'case-insensitive-name-matching=true' or 'case-sensitive-name-matching=true' can be set. " +
                    "These options are mutually exclusive.")));
        }

        if (connectionUrl == null) {
            throw new ConfigurationException(ImmutableList.of(new Message("connection-url is required but was not provided")));
        }
    }

    public int getFetchSize()
    {
        return fetchSize;
    }

    @Config("jdbc-fetch-size")
    @ConfigDescription("Number of rows to fetch from the database at a time")
    public BaseJdbcConfig setFetchSize(int fetchSize)
    {
        this.fetchSize = fetchSize;

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Remove case-insensitive-name-matching=true (legacy) and keep case-sensitive-name-matching=true, or vice versa
  2. Review the catalog .properties file for duplicated/legacy name-matching keys after upgrades
  3. Restart the coordinator/workers after fixing so the catalog reloads

Example fix

// before (catalog properties)
case-insensitive-name-matching=true
case-sensitive-name-matching=true
// after
case-sensitive-name-matching=true
Defensive patterns

Strategy: validation

Validate before calling

// Pre-validate catalog properties before deploying
Properties props = loadCatalogProperties(catalogFile);
if (Boolean.parseBoolean(props.getProperty("case-insensitive-name-matching", "false")) &&
    Boolean.parseBoolean(props.getProperty("case-sensitive-name-matching", "false"))) {
    throw new IllegalArgumentException("case-insensitive and case-sensitive name matching are mutually exclusive");
}

Prevention

When it happens

Trigger: Catalog properties file containing both case-insensitive-name-mapping=true and case-sensitive-name-matching=true; the exception is thrown when the config is instantiated/validated at connector startup.

Common situations: Upgrading Presto where the old option was left in the properties file while adding the new one; copying properties between catalogs; combining vendor-provided templates with local overrides.

Related errors


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/6bc52e9f9754c095. Report an issue: GitHub.