func getDefaultValue(ctx context.Context, c *ast.ColumnOption, tp byte, fsp int) (interface{}, error) { if tp == mysql.TypeTimestamp || tp == mysql.TypeDatetime { vd, err := evaluator.GetTimeValue(ctx, c.Expr, tp, fsp) value := vd.GetValue() if err != nil { return nil, errors.Trace(err) } // Value is nil means `default null`. if value == nil { return nil, nil } // If value is types.Time, convert it to string. if vv, ok := value.(types.Time); ok { return vv.String(), nil } return value, nil } v, err := evaluator.Eval(ctx, c.Expr) if err != nil { return nil, errors.Trace(err) } if v.IsNull() { return nil, nil } return v.ToString() }
// GetColDefaultValue gets default value of the column. func GetColDefaultValue(ctx context.Context, col *model.ColumnInfo) (types.Datum, bool, error) { // Check no default value flag. if mysql.HasNoDefaultValueFlag(col.Flag) && col.Tp != mysql.TypeEnum { return types.Datum{}, false, errors.Errorf("Field '%s' doesn't have a default value", col.Name) } // Check and get timestamp/datetime default value. if col.Tp == mysql.TypeTimestamp || col.Tp == mysql.TypeDatetime { if col.DefaultValue == nil { return types.Datum{}, true, nil } value, err := evaluator.GetTimeValue(ctx, col.DefaultValue, col.Tp, col.Decimal) if err != nil { return types.Datum{}, true, errors.Errorf("Field '%s' get default value fail - %s", col.Name, errors.Trace(err)) } return types.NewDatum(value), true, nil } else if col.Tp == mysql.TypeEnum { // For enum type, if no default value and not null is set, // the default value is the first element of the enum list if col.DefaultValue == nil && mysql.HasNotNullFlag(col.Flag) { return types.NewDatum(col.FieldType.Elems[0]), true, nil } } return types.NewDatum(col.DefaultValue), true, nil }
func (t *Table) setOnUpdateData(ctx context.Context, touched map[int]bool, data []types.Datum) error { ucols := table.FindOnUpdateCols(t.WritableCols()) for _, col := range ucols { if !touched[col.Offset] { value, err := evaluator.GetTimeValue(ctx, evaluator.CurrentTimestamp, col.Tp, col.Decimal) if err != nil { return errors.Trace(err) } data[col.Offset] = value touched[col.Offset] = true } } return nil }
// GetColDefaultValue gets default value of the column. func GetColDefaultValue(ctx context.Context, col *model.ColumnInfo) (types.Datum, bool, error) { // Check no default value flag. if mysql.HasNoDefaultValueFlag(col.Flag) && col.Tp != mysql.TypeEnum { err := errNoDefaultValue.Gen("Field '%s' doesn't have a default value", col.Name) if ctx != nil { sessVars := variable.GetSessionVars(ctx) if !sessVars.StrictSQLMode { // TODO: add warning. return GetZeroValue(col), true, nil } } return types.Datum{}, false, errors.Trace(err) } // Check and get timestamp/datetime default value. if col.Tp == mysql.TypeTimestamp || col.Tp == mysql.TypeDatetime { if col.DefaultValue == nil { return types.Datum{}, true, nil } value, err := evaluator.GetTimeValue(ctx, col.DefaultValue, col.Tp, col.Decimal) if err != nil { return types.Datum{}, true, errGetDefaultFailed.Gen("Field '%s' get default value fail - %s", col.Name, errors.Trace(err)) } return value, true, nil } else if col.Tp == mysql.TypeEnum { // For enum type, if no default value and not null is set, // the default value is the first element of the enum list if col.DefaultValue == nil && mysql.HasNotNullFlag(col.Flag) { return types.NewDatum(col.FieldType.Elems[0]), true, nil } } value, err := CastValue(ctx, types.NewDatum(col.DefaultValue), col) if err != nil { return types.Datum{}, false, errors.Trace(err) } return value, true, nil }