signoz/pkg/sqlschema/column.go

131 lines
3.1 KiB
Go
Raw Normal View History

package sqlschema
import (
"time"
"github.com/SigNoz/signoz/pkg/valuer"
)
var (
DataTypeText = DataType{s: valuer.NewString("TEXT"), z: ""}
DataTypeBigInt = DataType{s: valuer.NewString("BIGINT"), z: int64(0)}
DataTypeInteger = DataType{s: valuer.NewString("INTEGER"), z: int64(0)}
DataTypeNumeric = DataType{s: valuer.NewString("NUMERIC"), z: float64(0)}
DataTypeBoolean = DataType{s: valuer.NewString("BOOLEAN"), z: false}
DataTypeTimestamp = DataType{s: valuer.NewString("TIMESTAMP"), z: time.Time{}}
)
type DataType struct {
s valuer.String
z any
}
func (d DataType) String() string {
return d.s.String()
}
type ColumnName string
type Column struct {
// The name of the column in the table.
Name ColumnName
// The data type of the column. This will be translated to the the appropriate data type as per the dialect.
DataType DataType
// Whether the column is nullable.
Nullable bool
// The default value of the column.
Default string
}
func (column *Column) ToDefinitionSQL(fmter SQLFormatter) []byte {
sql := []byte{}
sql = fmter.AppendIdent(sql, string(column.Name))
sql = append(sql, " "...)
sql = append(sql, fmter.SQLDataTypeOf(column.DataType)...)
if !column.Nullable {
sql = append(sql, " NOT NULL"...)
}
if column.Default != "" {
sql = append(sql, " DEFAULT "...)
sql = append(sql, column.Default...)
}
return sql
}
func (column *Column) ToAddSQL(fmter SQLFormatter, tableName TableName, ifNotExists bool) []byte {
sql := []byte{}
sql = append(sql, "ALTER TABLE "...)
sql = fmter.AppendIdent(sql, string(tableName))
sql = append(sql, " ADD COLUMN "...)
if ifNotExists {
sql = append(sql, "IF NOT EXISTS "...)
}
if column.Default == "" && !column.Nullable {
adjustedColumn := &Column{
Name: column.Name,
DataType: column.DataType,
Nullable: true,
Default: column.Default,
}
sql = append(sql, adjustedColumn.ToDefinitionSQL(fmter)...)
} else {
sql = append(sql, column.ToDefinitionSQL(fmter)...)
}
return sql
}
func (column *Column) ToDropSQL(fmter SQLFormatter, tableName TableName, ifExists bool) []byte {
sql := []byte{}
sql = append(sql, "ALTER TABLE "...)
sql = fmter.AppendIdent(sql, string(tableName))
sql = append(sql, " DROP COLUMN "...)
if ifExists {
sql = append(sql, "IF EXISTS "...)
}
sql = fmter.AppendIdent(sql, string(column.Name))
return sql
}
func (column *Column) ToUpdateSQL(fmter SQLFormatter, tableName TableName, value any) []byte {
sql := []byte{}
sql = append(sql, "UPDATE "...)
sql = fmter.AppendIdent(sql, string(tableName))
sql = append(sql, " SET "...)
sql = fmter.AppendIdent(sql, string(column.Name))
sql = append(sql, " = "...)
if v, ok := value.(ColumnName); ok {
sql = fmter.AppendIdent(sql, string(v))
} else {
sql = fmter.AppendValue(sql, value)
}
return sql
}
func (column *Column) ToSetNotNullSQL(fmter SQLFormatter, tableName TableName) []byte {
sql := []byte{}
sql = append(sql, "ALTER TABLE "...)
sql = fmter.AppendIdent(sql, string(tableName))
sql = append(sql, " ALTER COLUMN "...)
sql = fmter.AppendIdent(sql, string(column.Name))
sql = append(sql, " SET NOT NULL"...)
return sql
}