NationalSecurityAgency/ghidra · error · SQLException

Could not fetch key value: {key}

Error message

Could not fetch key value: {key}

What it means

Thrown by KeyValueTable.getValue when a SELECT for the given key returns no rows. The keyvalue table stores named configuration/metadata entries (e.g., version, layout flags); requesting a key that is absent is treated as an error. This usually means the database was not fully initialized or the key name is wrong.

Source

Thrown at Ghidra/Features/BSim/src/main/java/ghidra/features/bsim/query/client/tables/KeyValueTable.java:159

	}

	/**
	 * 
	 * @param key the key to get the value for
	 * @return the value associated with key or throw exception if key not present
	 * @throws SQLException if the sql statement cannot be parsed
	 */
	public String getValue(String key) throws SQLException {
		PreparedStatement s =
			selectStatement.prepareIfNeeded(() -> db.prepareStatement(SELECT_STMT));
		s.setString(1, key);
		try (ResultSet rs = s.executeQuery()) {
			String value;
			if (rs.next()) {
				value = rs.getString(1);
			}
			else {
				throw new SQLException("Could not fetch key value: " + key);
			}
			return value;
		}
	}

}

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Check that the key name matches the current BSim version's expected keyvalue entries.
  2. If the key is optional, catch the exception and supply a default rather than failing.
  3. Re-initialize or upgrade the database so all required keyvalue rows are present.
  4. Inspect the keyvalue table directly to see which keys exist and compare against expected.

Example fix

// before
String version = kvTable.getValue("version"); // throws if absent

// after
String version;
try {
    version = kvTable.getValue("version");
} catch (SQLException e) {
    version = defaultVersion; // fallback for older/uninitialized databases
    log.warning("version key missing; using default " + version);
}
Defensive patterns

Strategy: fallback

Validate before calling

// Check the key exists before fetching, if a contains helper is available;
// otherwise wrap in try-catch and supply a default.
String key = "version";

Try / catch

String value;
try {
    value = kvTable.getValue(key);
} catch (SQLException e) {
    if (e.getMessage().contains("Could not fetch key value")) {
        value = defaults.getOrDefault(key, null);
        log.warning("Missing keyvalue '" + key + "'; using default");
    } else throw e;
}

Prevention

When it happens

Trigger: Calling getValue(key) with a key that has no row in the keyvalue table. Occurs during database open if expected metadata keys (version, layout) are missing — i.e., the database was created by an older/newer BSim version that uses a different key set, or initialization was interrupted before writing all keys.

Common situations: Opening a BSim database created by a different BSim version whose keyvalue schema differs. Partially initialized database missing required keys. Typo or changed key name between versions. Database that was copied without its keyvalue rows.

Related errors


AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14). Data as JSON: /api/errors/31b70174f1a47abc. Report an issue: GitHub.