188 lines
5.8 KiB
Go
188 lines
5.8 KiB
Go
// Package feature defines flags that represent optional SQL dialect capabilities.
|
|
// Each dialect (PostgreSQL, MySQL, SQLite, MSSQL) declares which features it supports
|
|
// by combining flags with the bitwise OR operator.
|
|
package feature
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
|
|
"github.com/uptrace/bun/internal"
|
|
)
|
|
|
|
// Feature is a bit flag representing an optional SQL dialect capability.
|
|
type Feature = internal.Flag
|
|
|
|
const (
|
|
// Common query features.
|
|
|
|
// CTE enables Common Table Expressions (WITH ... AS ...) syntax.
|
|
CTE Feature = 1 << iota
|
|
// WithValues enables WITH ... (VALUES ...) syntax for inline value lists.
|
|
WithValues
|
|
// Returning enables the RETURNING clause to return rows affected by DML statements.
|
|
Returning
|
|
// Output enables the OUTPUT clause, the MSSQL equivalent of RETURNING.
|
|
Output
|
|
// DefaultPlaceholder enables the DEFAULT keyword as a placeholder in INSERT value lists.
|
|
DefaultPlaceholder
|
|
// DoubleColonCast enables PostgreSQL-style :: type cast syntax.
|
|
DoubleColonCast
|
|
// ValuesRow enables VALUES ROW(...) syntax.
|
|
ValuesRow
|
|
// CompositeIn enables WHERE (A, B) IN ((N, NN), (N, NN), ...) composite comparison syntax.
|
|
CompositeIn
|
|
|
|
// SELECT features.
|
|
|
|
// OffsetFetch enables OFFSET ... FETCH NEXT syntax (MSSQL).
|
|
OffsetFetch
|
|
// SelectExists enables EXISTS subquery expressions.
|
|
SelectExists
|
|
|
|
// INSERT features.
|
|
|
|
// InsertReturning enables INSERT ... RETURNING syntax.
|
|
InsertReturning
|
|
// InsertTableAlias enables table alias support in INSERT statements.
|
|
InsertTableAlias
|
|
// InsertOnConflict enables INSERT ... ON CONFLICT syntax (PostgreSQL, SQLite).
|
|
InsertOnConflict
|
|
// InsertOnDuplicateKey enables INSERT ... ON DUPLICATE KEY syntax (MySQL).
|
|
InsertOnDuplicateKey
|
|
// InsertIgnore enables INSERT IGNORE syntax to silently skip conflicting rows (MySQL).
|
|
InsertIgnore
|
|
|
|
// UPDATE features.
|
|
|
|
// UpdateFromTable enables UPDATE ... FROM ... syntax for joining tables in updates.
|
|
UpdateFromTable
|
|
// UpdateMultiTable enables multi-table UPDATE syntax (MySQL).
|
|
UpdateMultiTable
|
|
// UpdateTableAlias enables table alias support in UPDATE statements.
|
|
UpdateTableAlias
|
|
// UpdateOrderLimit enables UPDATE ... ORDER BY ... LIMIT syntax.
|
|
UpdateOrderLimit
|
|
|
|
// DELETE features.
|
|
|
|
// DeleteReturning enables DELETE ... RETURNING syntax.
|
|
DeleteReturning
|
|
// DeleteTableAlias enables table alias support in DELETE statements.
|
|
DeleteTableAlias
|
|
// DeleteOrderLimit enables DELETE ... ORDER BY ... LIMIT syntax.
|
|
DeleteOrderLimit
|
|
|
|
// MERGE features.
|
|
|
|
// Merge enables MERGE ... USING ... ON ... WHEN syntax for upsert operations.
|
|
Merge
|
|
// MergeReturning enables MERGE ... RETURNING syntax.
|
|
MergeReturning
|
|
|
|
// Table DDL features.
|
|
|
|
// TableCascade enables CASCADE support for DROP TABLE and related operations.
|
|
TableCascade
|
|
// TableIdentity enables table-level IDENTITY property (MSSQL).
|
|
TableIdentity
|
|
// TableTruncate enables TRUNCATE TABLE support.
|
|
TableTruncate
|
|
// TableNotExists enables IF NOT EXISTS / IF EXISTS syntax for CREATE TABLE and DROP TABLE.
|
|
TableNotExists
|
|
// AlterColumnExists enables ADD/DROP COLUMN IF NOT EXISTS / IF EXISTS syntax.
|
|
AlterColumnExists
|
|
// CreateIndexIfNotExists enables CREATE INDEX IF NOT EXISTS syntax.
|
|
CreateIndexIfNotExists
|
|
|
|
// Column definition features.
|
|
|
|
// AutoIncrement enables AUTO_INCREMENT syntax for auto-generated columns (MySQL).
|
|
AutoIncrement
|
|
// Identity enables IDENTITY column syntax for auto-generated columns (MSSQL).
|
|
Identity
|
|
// GeneratedIdentity enables GENERATED ALWAYS AS IDENTITY syntax (PostgreSQL).
|
|
GeneratedIdentity
|
|
|
|
// Dialect-specific features.
|
|
|
|
// FKDefaultOnAction indicates that FK ON UPDATE/ON DELETE has the default value NO ACTION.
|
|
FKDefaultOnAction
|
|
// MSSavepoint enables Microsoft SQL Server savepoint support.
|
|
MSSavepoint
|
|
)
|
|
|
|
// NotSupportError is returned when an operation requires a feature
|
|
// that the current dialect does not support.
|
|
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)
|
|
}
|
|
|
|
// NewNotSupportError returns a NotSupportError for the given feature flag.
|
|
func NewNotSupportError(flag Feature) *NotSupportError {
|
|
return &NotSupportError{Flag: flag}
|
|
}
|
|
|
|
var flag2str = map[Feature]string{
|
|
// Common query features.
|
|
CTE: "CTE",
|
|
WithValues: "WithValues",
|
|
Returning: "Returning",
|
|
Output: "Output",
|
|
DefaultPlaceholder: "DefaultPlaceholder",
|
|
DoubleColonCast: "DoubleColonCast",
|
|
ValuesRow: "ValuesRow",
|
|
CompositeIn: "CompositeIn",
|
|
|
|
// SELECT features.
|
|
OffsetFetch: "OffsetFetch",
|
|
SelectExists: "SelectExists",
|
|
|
|
// INSERT features.
|
|
InsertReturning: "InsertReturning",
|
|
InsertTableAlias: "InsertTableAlias",
|
|
InsertOnConflict: "InsertOnConflict",
|
|
InsertOnDuplicateKey: "InsertOnDuplicateKey",
|
|
InsertIgnore: "InsertIgnore",
|
|
|
|
// UPDATE features.
|
|
UpdateFromTable: "UpdateFromTable",
|
|
UpdateMultiTable: "UpdateMultiTable",
|
|
UpdateTableAlias: "UpdateTableAlias",
|
|
UpdateOrderLimit: "UpdateOrderLimit",
|
|
|
|
// DELETE features.
|
|
DeleteReturning: "DeleteReturning",
|
|
DeleteTableAlias: "DeleteTableAlias",
|
|
DeleteOrderLimit: "DeleteOrderLimit",
|
|
|
|
// MERGE features.
|
|
Merge: "Merge",
|
|
MergeReturning: "MergeReturning",
|
|
|
|
// Table DDL features.
|
|
TableCascade: "TableCascade",
|
|
TableIdentity: "TableIdentity",
|
|
TableTruncate: "TableTruncate",
|
|
TableNotExists: "TableNotExists",
|
|
AlterColumnExists: "AlterColumnExists",
|
|
CreateIndexIfNotExists: "CreateIndexIfNotExists",
|
|
|
|
// Column definition features.
|
|
AutoIncrement: "AutoIncrement",
|
|
Identity: "Identity",
|
|
GeneratedIdentity: "GeneratedIdentity",
|
|
|
|
// Dialect-specific features.
|
|
FKDefaultOnAction: "FKDefaultOnAction",
|
|
MSSavepoint: "MSSavepoint",
|
|
}
|