function sets(data, columns, capSQL) {

    if (!data || typeof data !== 'object' || Array.isArray(data)) {
        throw new TypeError('Invalid parameter \'data\' specified.');
    }

    if (!(columns instanceof ColumnSet)) {
        columns = new ColumnSet(columns || data);
    }

    return npm.format(columns.assign({source: data}), columns.prepare(data), {capSQL});
}
@method helpers.sets
@description
Generates a string of comma-separated value-set statements from a single object: `col1=val1, col2=val2, ...`,
to be used as part of a query.

Since it is to be used as part of `UPDATE` queries, {@link helpers.Column Column} properties `cnd` and `skip` apply.

@param {object} data
A simple, non-null and non-array source object.

If it is anything else, the method will throw {@link external:TypeError TypeError} = `Invalid parameter 'data' specified.`

@param {array|helpers.Column|helpers.ColumnSet} [columns]
Columns for which to set values.

When not specified, properties of the `data` object are used.

When no effective columns are found, an empty string is returned.

@returns {string}
- comma-separated value-set statements for the `data` object
- an empty string, if no effective columns found

@see
 {@link helpers.Column Column},
 {@link helpers.ColumnSet ColumnSet}

@example

const pgp = require('pg-promise')();

const data = {id: 1, val: 123, msg: 'hello'};

// Properties can be pulled automatically from the object:

pgp.helpers.sets(data);
//=> "id"=1,"val"=123,"msg"='hello'

@example

// Column details from a reusable ColumnSet (recommended for performance);
// NOTE: Conditional columns (start with '?') are skipped:
const {ColumnSet, sets} = pgp.helpers;

const cs = new ColumnSet(['?id','val', 'msg']);

sets(data, cs);
//=> "val"=123,"msg"='hello'