summaryrefslogtreecommitdiff
path: root/vendor/github.com/uptrace/bun/query_base.go
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2022-04-24 12:26:22 +0200
committerLibravatar GitHub <noreply@github.com>2022-04-24 12:26:22 +0200
commit88979b35d462516e1765524d70a41c0d26eec911 (patch)
treefd37cb19317217e226ee7717824f24031f53b031 /vendor/github.com/uptrace/bun/query_base.go
parentRevert "[chore] Tidy up federating db locks a tiny bit (#472)" (#479) (diff)
downloadgotosocial-88979b35d462516e1765524d70a41c0d26eec911.tar.xz
[chore] Update bun and sqlite dependencies (#478)
* update bun + sqlite versions * step bun to v1.1.3
Diffstat (limited to 'vendor/github.com/uptrace/bun/query_base.go')
-rw-r--r--vendor/github.com/uptrace/bun/query_base.go211
1 files changed, 177 insertions, 34 deletions
diff --git a/vendor/github.com/uptrace/bun/query_base.go b/vendor/github.com/uptrace/bun/query_base.go
index 8b78d25e1..147a8fbd3 100644
--- a/vendor/github.com/uptrace/bun/query_base.go
+++ b/vendor/github.com/uptrace/bun/query_base.go
@@ -65,6 +65,24 @@ var (
_ IDB = (*Tx)(nil)
)
+// QueryBuilder is used for common query methods
+type QueryBuilder interface {
+ Query
+ Where(query string, args ...interface{}) QueryBuilder
+ WhereGroup(sep string, fn func(QueryBuilder) QueryBuilder) QueryBuilder
+ WhereOr(query string, args ...interface{}) QueryBuilder
+ WhereDeleted() QueryBuilder
+ WhereAllWithDeleted() QueryBuilder
+ WherePK(cols ...string) QueryBuilder
+ Unwrap() interface{}
+}
+
+var (
+ _ QueryBuilder = (*selectQueryBuilder)(nil)
+ _ QueryBuilder = (*updateQueryBuilder)(nil)
+ _ QueryBuilder = (*deleteQueryBuilder)(nil)
+)
+
type baseQuery struct {
db *DB
conn IConn
@@ -87,6 +105,10 @@ func (q *baseQuery) DB() *DB {
return q.db
}
+func (q *baseQuery) GetConn() IConn {
+ return q.conn
+}
+
func (q *baseQuery) GetModel() Model {
return q.model
}
@@ -105,12 +127,16 @@ func (q *baseQuery) GetTableName() string {
}
if q.modelTableName.Query != "" {
- b, _ := q.modelTableName.AppendQuery(q.db.fmter, nil)
- return string(b)
+ return q.modelTableName.Query
}
+
if len(q.tables) > 0 {
- return q.tables[0].Query
+ b, _ := q.tables[0].AppendQuery(q.db.fmter, nil)
+ if len(b) < 64 {
+ return string(b)
+ }
}
+
return ""
}
@@ -166,6 +192,10 @@ func (q *baseQuery) beforeAppendModel(ctx context.Context, query Query) error {
return nil
}
+func (q *baseQuery) hasFeature(feature feature.Feature) bool {
+ return q.db.features.Has(feature)
+}
+
//------------------------------------------------------------------------------
func (q *baseQuery) checkSoftDelete() error {
@@ -228,26 +258,68 @@ func (q *baseQuery) appendWith(fmter schema.Formatter, b []byte) (_ []byte, err
b = append(b, ", "...)
}
- b = fmter.AppendIdent(b, with.name)
- if q, ok := with.query.(schema.ColumnsAppender); ok {
- b = append(b, " ("...)
- b, err = q.AppendColumns(fmter, b)
- if err != nil {
- return nil, err
- }
- b = append(b, ")"...)
+ b, err = q.appendCTE(fmter, b, with)
+ if err != nil {
+ return nil, err
+ }
+ }
+ b = append(b, ' ')
+ return b, nil
+}
+
+func (q *baseQuery) appendCTE(
+ fmter schema.Formatter, b []byte, cte withQuery,
+) (_ []byte, err error) {
+ if !fmter.Dialect().Features().Has(feature.WithValues) {
+ if values, ok := cte.query.(*ValuesQuery); ok {
+ return q.appendSelectFromValues(fmter, b, cte, values)
}
+ }
- b = append(b, " AS ("...)
+ b = fmter.AppendIdent(b, cte.name)
- b, err = with.query.AppendQuery(fmter, b)
+ if q, ok := cte.query.(schema.ColumnsAppender); ok {
+ b = append(b, " ("...)
+ b, err = q.AppendColumns(fmter, b)
if err != nil {
return nil, err
}
+ b = append(b, ")"...)
+ }
- b = append(b, ')')
+ b = append(b, " AS ("...)
+
+ b, err = cte.query.AppendQuery(fmter, b)
+ if err != nil {
+ return nil, err
}
- b = append(b, ' ')
+
+ b = append(b, ")"...)
+ return b, nil
+}
+
+func (q *baseQuery) appendSelectFromValues(
+ fmter schema.Formatter, b []byte, cte withQuery, values *ValuesQuery,
+) (_ []byte, err error) {
+ b = fmter.AppendIdent(b, cte.name)
+ b = append(b, " AS (SELECT * FROM ("...)
+
+ b, err = cte.query.AppendQuery(fmter, b)
+ if err != nil {
+ return nil, err
+ }
+
+ b = append(b, ") AS t"...)
+ if q, ok := cte.query.(schema.ColumnsAppender); ok {
+ b = append(b, " ("...)
+ b, err = q.AppendColumns(fmter, b)
+ if err != nil {
+ return nil, err
+ }
+ b = append(b, ")"...)
+ }
+ b = append(b, ")"...)
+
return b, nil
}
@@ -428,6 +500,9 @@ func (q *baseQuery) appendColumns(fmter schema.Formatter, b []byte) (_ []byte, e
func (q *baseQuery) getFields() ([]*schema.Field, error) {
if len(q.columns) == 0 {
+ if q.table == nil {
+ return nil, errNilModel
+ }
return q.table.Fields, nil
}
return q._getFields(false)
@@ -435,6 +510,9 @@ func (q *baseQuery) getFields() ([]*schema.Field, error) {
func (q *baseQuery) getDataFields() ([]*schema.Field, error) {
if len(q.columns) == 0 {
+ if q.table == nil {
+ return nil, errNilModel
+ }
return q.table.DataFields, nil
}
return q._getFields(true)
@@ -541,6 +619,62 @@ func (q *baseQuery) AppendNamedArg(fmter schema.Formatter, b []byte, name string
return b, false
}
+//------------------------------------------------------------------------------
+
+func (q *baseQuery) Dialect() schema.Dialect {
+ return q.db.Dialect()
+}
+
+func (q *baseQuery) NewValues(model interface{}) *ValuesQuery {
+ return NewValuesQuery(q.db, model).Conn(q.conn)
+}
+
+func (q *baseQuery) NewSelect() *SelectQuery {
+ return NewSelectQuery(q.db).Conn(q.conn)
+}
+
+func (q *baseQuery) NewInsert() *InsertQuery {
+ return NewInsertQuery(q.db).Conn(q.conn)
+}
+
+func (q *baseQuery) NewUpdate() *UpdateQuery {
+ return NewUpdateQuery(q.db).Conn(q.conn)
+}
+
+func (q *baseQuery) NewDelete() *DeleteQuery {
+ return NewDeleteQuery(q.db).Conn(q.conn)
+}
+
+func (q *baseQuery) NewCreateTable() *CreateTableQuery {
+ return NewCreateTableQuery(q.db).Conn(q.conn)
+}
+
+func (q *baseQuery) NewDropTable() *DropTableQuery {
+ return NewDropTableQuery(q.db).Conn(q.conn)
+}
+
+func (q *baseQuery) NewCreateIndex() *CreateIndexQuery {
+ return NewCreateIndexQuery(q.db).Conn(q.conn)
+}
+
+func (q *baseQuery) NewDropIndex() *DropIndexQuery {
+ return NewDropIndexQuery(q.db).Conn(q.conn)
+}
+
+func (q *baseQuery) NewTruncateTable() *TruncateTableQuery {
+ return NewTruncateTableQuery(q.db).Conn(q.conn)
+}
+
+func (q *baseQuery) NewAddColumn() *AddColumnQuery {
+ return NewAddColumnQuery(q.db).Conn(q.conn)
+}
+
+func (q *baseQuery) NewDropColumn() *DropColumnQuery {
+ return NewDropColumnQuery(q.db).Conn(q.conn)
+}
+
+//------------------------------------------------------------------------------
+
func appendColumns(b []byte, table schema.Safe, fields []*schema.Field) []byte {
for i, f := range fields {
if i > 0 {
@@ -653,15 +787,18 @@ func (q *whereBaseQuery) appendWhere(
if len(b) > startLen {
b = append(b, " AND "...)
}
+
if withAlias {
b = append(b, q.tableModel.Table().SQLAlias...)
- b = append(b, '.')
+ } else {
+ b = append(b, q.tableModel.Table().SQLName...)
}
+ b = append(b, '.')
field := q.tableModel.Table().SoftDeleteField
b = append(b, field.SQLName...)
- if field.NullZero {
+ if field.IsPtr || field.NullZero {
if q.flags.Has(deletedFlag) {
b = append(b, " IS NOT NULL"...)
} else {
@@ -843,27 +980,21 @@ func (q *returningQuery) addReturningField(field *schema.Field) {
q.returningFields = append(q.returningFields, field)
}
-func (q *returningQuery) hasReturning() bool {
- if len(q.returning) == 1 {
- if ret := q.returning[0]; len(ret.Args) == 0 {
- switch ret.Query {
- case "", "null", "NULL":
- return false
- }
- }
- }
- return len(q.returning) > 0 || len(q.returningFields) > 0
-}
-
func (q *returningQuery) appendReturning(
fmter schema.Formatter, b []byte,
) (_ []byte, err error) {
- if !q.hasReturning() {
- return b, nil
- }
+ return q._appendReturning(fmter, b, "")
+}
- b = append(b, " RETURNING "...)
+func (q *returningQuery) appendOutput(
+ fmter schema.Formatter, b []byte,
+) (_ []byte, err error) {
+ return q._appendReturning(fmter, b, "INSERTED")
+}
+func (q *returningQuery) _appendReturning(
+ fmter schema.Formatter, b []byte, table string,
+) (_ []byte, err error) {
for i, f := range q.returning {
if i > 0 {
b = append(b, ", "...)
@@ -878,10 +1009,22 @@ func (q *returningQuery) appendReturning(
return b, nil
}
- b = appendColumns(b, "", q.returningFields)
+ b = appendColumns(b, schema.Safe(table), q.returningFields)
return b, nil
}
+func (q *returningQuery) hasReturning() bool {
+ if len(q.returning) == 1 {
+ if ret := q.returning[0]; len(ret.Args) == 0 {
+ switch ret.Query {
+ case "", "null", "NULL":
+ return false
+ }
+ }
+ }
+ return len(q.returning) > 0 || len(q.returningFields) > 0
+}
+
//------------------------------------------------------------------------------
type columnValue struct {