Skip to content

Commit

Permalink
feat: add feature flag AlterColumnExists
Browse files Browse the repository at this point in the history
With #704
  • Loading branch information
j2gg0s committed Jan 13, 2025
1 parent c375f2a commit 5fe4f8e
Show file tree
Hide file tree
Showing 21 changed files with 87 additions and 25 deletions.
58 changes: 57 additions & 1 deletion dialect/feature/feature.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
package feature

import "github.com/uptrace/bun/internal"
import (
"fmt"
"strconv"

"github.com/uptrace/bun/internal"
)

type Feature = internal.Flag

Expand Down Expand Up @@ -35,4 +40,55 @@ const (
UpdateOrderLimit // UPDATE ... ORDER BY ... LIMIT ...
DeleteOrderLimit // DELETE ... ORDER BY ... LIMIT ...
DeleteReturning
AlterColumnExists // ADD/DROP COLUMN IF NOT EXISTS/IF EXISTS
)

type NotSupportError struct {
Flag Feature
}

func (err *NotSupportError) Error() string {
name, ok := flag2str[err.Flag]
if !ok {
name = strconv.FormatInt(int64(err.Flag), 10)
}
return fmt.Sprintf("bun: feature %s is not supported by current dialect", name)
}

func NewNotSupportError(flag Feature) *NotSupportError {
return &NotSupportError{Flag: flag}
}

var flag2str = map[Feature]string{
CTE: "CTE",
WithValues: "WithValues",
Returning: "Returning",
InsertReturning: "InsertReturning",
Output: "Output",
DefaultPlaceholder: "DefaultPlaceholder",
DoubleColonCast: "DoubleColonCast",
ValuesRow: "ValuesRow",
UpdateMultiTable: "UpdateMultiTable",
InsertTableAlias: "InsertTableAlias",
UpdateTableAlias: "UpdateTableAlias",
DeleteTableAlias: "DeleteTableAlias",
AutoIncrement: "AutoIncrement",
Identity: "Identity",
TableCascade: "TableCascade",
TableIdentity: "TableIdentity",
TableTruncate: "TableTruncate",
InsertOnConflict: "InsertOnConflict",
InsertOnDuplicateKey: "InsertOnDuplicateKey",
InsertIgnore: "InsertIgnore",
TableNotExists: "TableNotExists",
OffsetFetch: "OffsetFetch",
SelectExists: "SelectExists",
UpdateFromTable: "UpdateFromTable",
MSSavepoint: "MSSavepoint",
GeneratedIdentity: "GeneratedIdentity",
CompositeIn: "CompositeIn",
UpdateOrderLimit: "UpdateOrderLimit",
DeleteOrderLimit: "DeleteOrderLimit",
DeleteReturning: "DeleteReturning",
AlterColumnExists: "AlterColumnExists",
}
3 changes: 2 additions & 1 deletion dialect/pgdialect/dialect.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ func New(opts ...DialectOption) *Dialect {
feature.SelectExists |
feature.GeneratedIdentity |
feature.CompositeIn |
feature.DeleteReturning
feature.DeleteReturning |
feature.AlterColumnExists

for _, opt := range opts {
opt(d)
Expand Down
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-mssql2019-168
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bun: order is not supported for current dialect
bun: feature DeleteOrderLimit is not supported by current dialect
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-mssql2019-169
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bun: limit is not supported for current dialect
bun: feature DeleteOrderLimit is not supported by current dialect
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-mssql2019-170
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bun: limit is not supported for current dialect
bun: feature DeleteOrderLimit is not supported by current dialect
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-mssql2019-171
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bun: limit is not supported for current dialect
bun: feature UpdateOrderLimit is not supported by current dialect
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-pg-168
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bun: order is not supported for current dialect
bun: feature DeleteOrderLimit is not supported by current dialect
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-pg-169
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bun: limit is not supported for current dialect
bun: feature DeleteOrderLimit is not supported by current dialect
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-pg-170
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bun: limit is not supported for current dialect
bun: feature DeleteOrderLimit is not supported by current dialect
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-pg-171
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bun: limit is not supported for current dialect
bun: feature UpdateOrderLimit is not supported by current dialect
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-pgx-168
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bun: order is not supported for current dialect
bun: feature DeleteOrderLimit is not supported by current dialect
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-pgx-169
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bun: limit is not supported for current dialect
bun: feature DeleteOrderLimit is not supported by current dialect
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-pgx-170
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bun: limit is not supported for current dialect
bun: feature DeleteOrderLimit is not supported by current dialect
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-pgx-171
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bun: limit is not supported for current dialect
bun: feature UpdateOrderLimit is not supported by current dialect
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-sqlite-168
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bun: order is not supported for current dialect
bun: feature DeleteOrderLimit is not supported by current dialect
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-sqlite-169
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bun: limit is not supported for current dialect
bun: feature DeleteOrderLimit is not supported by current dialect
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-sqlite-170
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bun: limit is not supported for current dialect
bun: feature DeleteOrderLimit is not supported by current dialect
2 changes: 1 addition & 1 deletion internal/dbtest/testdata/snapshots/TestQuery-sqlite-171
Original file line number Diff line number Diff line change
@@ -1 +1 @@
bun: limit is not supported for current dialect
bun: feature UpdateOrderLimit is not supported by current dialect
5 changes: 5 additions & 0 deletions query_column_add.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"database/sql"
"fmt"

"github.com/uptrace/bun/dialect/feature"
"github.com/uptrace/bun/internal"
"github.com/uptrace/bun/schema"
)
Expand Down Expand Up @@ -133,6 +134,10 @@ func (q *AddColumnQuery) AppendQuery(fmter schema.Formatter, b []byte) (_ []byte
//------------------------------------------------------------------------------

func (q *AddColumnQuery) Exec(ctx context.Context, dest ...interface{}) (sql.Result, error) {
if q.ifNotExists && !q.hasFeature(feature.AlterColumnExists) {
return nil, feature.NewNotSupportError(feature.AlterColumnExists)
}

queryBytes, err := q.AppendQuery(q.db.fmter, q.db.makeQueryBytes())
if err != nil {
return nil, err
Expand Down
8 changes: 4 additions & 4 deletions query_delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ func (q *DeleteQuery) WhereAllWithDeleted() *DeleteQuery {

func (q *DeleteQuery) Order(orders ...string) *DeleteQuery {
if !q.hasFeature(feature.DeleteOrderLimit) {
q.err = errors.New("bun: order is not supported for current dialect")
q.err = feature.NewNotSupportError(feature.DeleteOrderLimit)
return q
}
q.addOrder(orders...)
Expand All @@ -137,7 +137,7 @@ func (q *DeleteQuery) Order(orders ...string) *DeleteQuery {

func (q *DeleteQuery) OrderExpr(query string, args ...interface{}) *DeleteQuery {
if !q.hasFeature(feature.DeleteOrderLimit) {
q.err = errors.New("bun: order is not supported for current dialect")
q.err = feature.NewNotSupportError(feature.DeleteOrderLimit)
return q
}
q.addOrderExpr(query, args...)
Expand All @@ -152,7 +152,7 @@ func (q *DeleteQuery) ForceDelete() *DeleteQuery {
// ------------------------------------------------------------------------------
func (q *DeleteQuery) Limit(n int) *DeleteQuery {
if !q.hasFeature(feature.DeleteOrderLimit) {
q.err = errors.New("bun: limit is not supported for current dialect")
q.err = feature.NewNotSupportError(feature.DeleteOrderLimit)
return q
}
q.setLimit(n)
Expand All @@ -166,7 +166,7 @@ func (q *DeleteQuery) Limit(n int) *DeleteQuery {
// To suppress the auto-generated RETURNING clause, use `Returning("NULL")`.
func (q *DeleteQuery) Returning(query string, args ...interface{}) *DeleteQuery {
if !q.hasFeature(feature.DeleteReturning) {
q.err = errors.New("bun: returning is not supported for current dialect")
q.err = feature.NewNotSupportError(feature.DeleteOrderLimit)
return q
}

Expand Down
6 changes: 3 additions & 3 deletions query_update.go
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ func (q *UpdateQuery) WhereAllWithDeleted() *UpdateQuery {
// ------------------------------------------------------------------------------
func (q *UpdateQuery) Order(orders ...string) *UpdateQuery {
if !q.hasFeature(feature.UpdateOrderLimit) {
q.err = errors.New("bun: order is not supported for current dialect")
q.err = feature.NewNotSupportError(feature.UpdateOrderLimit)
return q
}
q.addOrder(orders...)
Expand All @@ -216,7 +216,7 @@ func (q *UpdateQuery) Order(orders ...string) *UpdateQuery {

func (q *UpdateQuery) OrderExpr(query string, args ...interface{}) *UpdateQuery {
if !q.hasFeature(feature.UpdateOrderLimit) {
q.err = errors.New("bun: order is not supported for current dialect")
q.err = feature.NewNotSupportError(feature.UpdateOrderLimit)
return q
}
q.addOrderExpr(query, args...)
Expand All @@ -225,7 +225,7 @@ func (q *UpdateQuery) OrderExpr(query string, args ...interface{}) *UpdateQuery

func (q *UpdateQuery) Limit(n int) *UpdateQuery {
if !q.hasFeature(feature.UpdateOrderLimit) {
q.err = errors.New("bun: limit is not supported for current dialect")
q.err = feature.NewNotSupportError(feature.UpdateOrderLimit)
return q
}
q.setLimit(n)
Expand Down

0 comments on commit 5fe4f8e

Please sign in to comment.