func (d Driver) UpsertSQL(t *qb.Table, conflict []qb.Field, q qb.Query) (string, []interface{}) {
	c := qb.NewContext(d, qb.NoAlias())
	sql := ``
	for k, v := range conflict {
		if k > 0 {
			sql += qb.COMMA
		}
		sql += v.QueryString(c)
	}
	usql, values := q.SQL(qb.NewSQLBuilder(d))
	if !strings.HasPrefix(usql, `UPDATE `+t.Name) {
		panic(`Update does not update the correct table`)
	}
	usql = strings.ReplaceAll(usql, `UPDATE `+t.Name, `UPDATE`)
	return `ON CONFLICT (` + sql + `) DO ` + usql, values
}
UpsertSQL implements qb.Driver
package pgqb  
import (
	"database/sql"
	"strconv"
	"strings"
	"git.ultraware.nl/NiseVoid/qb"
	"git.ultraware.nl/NiseVoid/qb/driver/pgqb/pgqc"
	"git.ultraware.nl/NiseVoid/qb/driver/pgqb/pgqf"
	"git.ultraware.nl/NiseVoid/qb/qbdb"
	"git.ultraware.nl/NiseVoid/qb/qc"
	"git.ultraware.nl/NiseVoid/qb/qf"
)
type Driver struct{}
func New(db *sql.DB) qbdb.DB {
	return qbdb.New(Driver{}, db)
}
func (d Driver) ValueString(c int) string {
	return `$` + strconv.Itoa(c)
}
func (d Driver) BoolString(v bool) string {
	return strconv.FormatBool(v)
}
func (d Driver) EscapeCharacter() string {
	return `"`
}