class v460Updater extends AbstractUpgradeItem {

    private static final Logger LOGGER = Logger.getLogger(v460Updater.class);

    @Override
    public String getSchemaVersion() {
        return "4.6.0";
    }

    @Override
    public void executeUpgrade(final AlpineQueryManager qm, final Connection connection) throws Exception {<FILL_FUNCTION_BODY>}
}

        // Fixes https://github.com/DependencyTrack/dependency-track/issues/1661
        // The JDBC type "CLOB" is mapped to the type CLOB for H2, MEDIUMTEXT for MySQL, and TEXT for PostgreSQL and SQL Server.
        // - https://github.com/datanucleus/datanucleus-rdbms/blob/datanucleus-rdbms-5.2.11/src/main/java/org/datanucleus/store/rdbms/adapter/H2Adapter.java#L484
        // - https://github.com/datanucleus/datanucleus-rdbms/blob/datanucleus-rdbms-5.2.11/src/main/java/org/datanucleus/store/rdbms/adapter/MySQLAdapter.java#L185-L186
        // - https://github.com/datanucleus/datanucleus-rdbms/blob/datanucleus-rdbms-5.2.11/src/main/java/org/datanucleus/store/rdbms/adapter/PostgreSQLAdapter.java#L144
        // - https://github.com/datanucleus/datanucleus-rdbms/blob/datanucleus-rdbms-5.2.11/src/main/java/org/datanucleus/store/rdbms/adapter/SQLServerAdapter.java#L168-L169
        LOGGER.info("Changing JDBC type of \"ANALYSIS\".\"DETAILS\" from VARCHAR to CLOB");
        if (DbUtil.isH2()) {
            DbUtil.executeUpdate(connection, "ALTER TABLE \"ANALYSIS\" ADD \"DETAILS_V46\" CLOB");
        } else if (DbUtil.isMysql()) {
            DbUtil.executeUpdate(connection, "ALTER TABLE \"ANALYSIS\" ADD \"DETAILS_V46\" MEDIUMTEXT");
        } else {
            DbUtil.executeUpdate(connection, "ALTER TABLE \"ANALYSIS\" ADD \"DETAILS_V46\" TEXT");
        }
        DbUtil.executeUpdate(connection, "UPDATE \"ANALYSIS\" SET \"DETAILS_V46\" = \"DETAILS\"");
        DbUtil.executeUpdate(connection, "ALTER TABLE \"ANALYSIS\" DROP COLUMN \"DETAILS\"");
        if (DbUtil.isMssql()) { // Really, Microsoft? You're being weird.
            DbUtil.executeUpdate(connection, "EXEC sp_rename 'ANALYSIS.DETAILS_V46', 'DETAILS', 'COLUMN'");
        } else if (DbUtil.isMysql()) { // MySQL < 8.0 does not support RENAME COLUMN and needs a special treatment.
            DbUtil.executeUpdate(connection, "ALTER TABLE \"ANALYSIS\" CHANGE \"DETAILS_V46\" \"DETAILS\" MEDIUMTEXT");
        } else {
            DbUtil.executeUpdate(connection, "ALTER TABLE \"ANALYSIS\" RENAME COLUMN \"DETAILS_V46\" TO \"DETAILS\"");
        }

        LOGGER.info("Updating Package URLs of PHP Packages for GHSA Vulnerabilities");
        try (final Statement stmt = connection.createStatement()) {
            final ResultSet rs = stmt.executeQuery("""
                    SELECT "ID", "PURL_NAME"
                    FROM "VULNERABLESOFTWARE"
                    WHERE "PURL_TYPE" = 'composer'
                        AND "PURL_NAMESPACE" IS NULL
                        AND "PURL_NAME" LIKE '%/%'
                    """);
            while (rs.next()) {
                final String purlName = rs.getString(2);
                final String[] purlParts = purlName.split("/");

                final String namespace = String.join("/", Arrays.copyOfRange(purlParts, 0, purlParts.length - 1));

                final PreparedStatement ps = connection.prepareStatement("""
                        UPDATE "VULNERABLESOFTWARE" SET "PURL_NAMESPACE" = ?, "PURL_NAME" = ? WHERE "ID" = ?
                        """);
                ps.setString(1, namespace);
                ps.setString(2, purlParts[purlParts.length - 1]);
                ps.setLong(3, rs.getLong(1));
                ps.executeUpdate();
            }
        }
    
<no_super_class>