async function dropColumn(tableName, column, transaction = db.knex, columnSpec = {}) {
    if (Object.prototype.hasOwnProperty.call(columnSpec, 'references')) {
        const [toTable, toColumn] = columnSpec.references.split('.');
        await dropForeign({fromTable: tableName, fromColumn: column, toTable, toColumn, constraintName: columnSpec.constraintName, transaction});
    }

    const dropColumnBuilder = transaction.schema.table(tableName, function (table) {
        table.dropColumn(column);
    });

    // Use the default flow for SQLite because .toSQL() is tricky with SQLite when
    // it does the table dance
    if (DatabaseInfo.isSQLite(transaction)) {
        await dropColumnBuilder;
        return;
    }

    for (const sqlQuery of dropColumnBuilder.toSQL()) {
        let sql = sqlQuery.sql;

        if (DatabaseInfo.isMySQL(transaction)) {
            // Guard against an ending semicolon
            sql = sql.replace(/;\s*$/, '') + ', algorithm=copy';
        }

        await transaction.raw(sql);
    }
}
@param {string} tableName
@param {string} column
@param {import('knex').Knex} [transaction]
@param {object} [columnSpec]