apache/seatunnel · error · IllegalArgumentException

Oracle database name must be in all uppercase, database

Error message

Oracle database name must be in all uppercase, database: ${database}

What it means

Thrown by validateConfig when a database name in database-list contains any lowercase letter. Oracle stores database/PDB names in uppercase, and the connector relies on exact uppercase matching against redo-log metadata, so mixed-case names would silently match nothing.

Solutions

  1. Uppercase the database name in database-list, e.g. ORCLPDB1.
  2. Check v$database.name / v$pdbs for the exact uppercase name.
  3. Avoid quoted mixed-case identifiers in the database configuration.

Example fix

// before
database-list = ["orclpdb1"]
// after
database-list = ["ORCLPDB1"]
Defensive patterns

Strategy: validation

Validate before calling

if (!database.equals(database.toUpperCase(java.util.Locale.ROOT)))
    throw new IllegalArgumentException("database must be uppercase: " + database);

Prevention

When it happens

Trigger: database-list = ["orclpdb1"] or ["OrclPdb1"] passed to OracleSourceConfigFactory before create().

Common situations: Users write the database name in the case it appears in their connection URL or OS, unaware Oracle identifiers are conventionally uppercase; frequent after copying lowercase service names.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/ad94e8f683d1b55a. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-connectors-v2/connector-cdc/connector-cdc-oracle/src/main/java/org/apache/seatunnel/connectors/seatunnel/cdc/oracle/config/OracleSourceConfigFactory.java:200

                        connectTimeoutMillis,
                        connectMaxRetries,
                        connectionPoolSize,
                        exactlyOnce);
        // Propagate the enableConcurrentRead flag so the chunk splitter can skip split analysis.
        config.setEnableConcurrentRead(this.enableConcurrentRead);
        return config;
    }

    private void validateConfig() throws IllegalArgumentException {
        if (databaseList.size() != 1) {
            throw new IllegalArgumentException(
                    "Oracle only supports single database, databaseList: " + databaseList);
        }
        for (String database : databaseList) {
            for (int i = 0; i < database.length(); i++) {
                if (Character.isLetter(database.charAt(i))
                        && !Character.isUpperCase(database.charAt(i))) {
                    throw new IllegalArgumentException(
                            "Oracle database name must be in all uppercase, database: " + database);
                }
            }
        }
        for (String table : tableList) {
            if (table.split("\\.").length != 3 && table.split("\\.").length != 2) {
                throw new IllegalArgumentException(
                        "Oracle table name format must be is: ${database}.${schema}.${table} or ${schema}.${table}, table: "
                                + table);
            }
            for (int i = 0; i < table.length(); i++) {
                if (Character.isLetter(table.charAt(i))
                        && !Character.isUpperCase(table.charAt(i))) {
                    throw new IllegalArgumentException(
                            "Oracle table name must be in all uppercase, table: " + table);
                }
            }
        }

View on GitHub (pinned to cf67b549a7)