本文整理汇总了Golang中github.com/pingcap/tidb/util/types.NewDatum函数的典型用法代码示例。如果您正苦于以下问题:Golang NewDatum函数的具体用法?Golang NewDatum怎么用?Golang NewDatum使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了NewDatum函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: GetColDefaultValue
// 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
}
示例2: flatten
func flatten(data types.Datum) (types.Datum, error) {
switch data.Kind() {
case types.KindMysqlTime:
// for mysql datetime, timestamp and date type
b, err := data.GetMysqlTime().Marshal()
if err != nil {
return types.NewDatum(nil), errors.Trace(err)
}
return types.NewDatum(b), nil
case types.KindMysqlDuration:
// for mysql time type
data.SetInt64(int64(data.GetMysqlDuration().Duration))
return data, nil
case types.KindMysqlDecimal:
data.SetString(data.GetMysqlDecimal().String())
return data, nil
case types.KindMysqlEnum:
data.SetUint64(data.GetMysqlEnum().Value)
return data, nil
case types.KindMysqlSet:
data.SetUint64(data.GetMysqlSet().Value)
return data, nil
case types.KindMysqlBit:
data.SetUint64(data.GetMysqlBit().Value)
return data, nil
case types.KindMysqlHex:
data.SetInt64(data.GetMysqlHex().Value)
return data, nil
default:
return data, nil
}
}
示例3: getRowCountByTableRange
func getRowCountByTableRange(sc *variable.StatementContext, statsTbl *statistics.Table, ranges []TableRange, offset int) (uint64, error) {
var rowCount uint64
for _, rg := range ranges {
var cnt int64
var err error
if rg.LowVal == math.MinInt64 && rg.HighVal == math.MaxInt64 {
cnt = statsTbl.Count
} else if rg.LowVal == math.MinInt64 {
cnt, err = statsTbl.Columns[offset].LessRowCount(sc, types.NewDatum(rg.HighVal))
} else if rg.HighVal == math.MaxInt64 {
cnt, err = statsTbl.Columns[offset].GreaterRowCount(sc, types.NewDatum(rg.LowVal))
} else {
if rg.LowVal == rg.HighVal {
cnt, err = statsTbl.Columns[offset].EqualRowCount(sc, types.NewDatum(rg.LowVal))
} else {
cnt, err = statsTbl.Columns[offset].BetweenRowCount(sc, types.NewDatum(rg.LowVal), types.NewDatum(rg.HighVal))
}
}
if err != nil {
return 0, errors.Trace(err)
}
rowCount += uint64(cnt)
}
if rowCount > uint64(statsTbl.Count) {
rowCount = uint64(statsTbl.Count)
}
return rowCount, nil
}
示例4: evalIn
func (e *Evaluator) evalIn(expr *tipb.Expr) (types.Datum, error) {
if len(expr.Children) != 2 {
return types.Datum{}, ErrInvalid.Gen("IN need 2 operand, got %d", len(expr.Children))
}
target, err := e.Eval(expr.Children[0])
if err != nil {
return types.Datum{}, errors.Trace(err)
}
if target.IsNull() {
return types.Datum{}, nil
}
valueListExpr := expr.Children[1]
if valueListExpr.GetTp() != tipb.ExprType_ValueList {
return types.Datum{}, ErrInvalid.Gen("the second children should be value list type")
}
decoded, err := e.decodeValueList(valueListExpr)
if err != nil {
return types.Datum{}, errors.Trace(err)
}
in, err := checkIn(target, decoded.values)
if err != nil {
return types.Datum{}, errors.Trace(err)
}
if in {
return types.NewDatum(1), nil
}
if decoded.hasNull {
return types.Datum{}, nil
}
return types.NewDatum(0), nil
}
示例5: fetchRows
func (e *UpdateExec) fetchRows() error {
for {
row, err := e.SelectExec.Next()
if err != nil {
return errors.Trace(err)
}
if row == nil {
return nil
}
data := make([]types.Datum, len(e.SelectExec.Fields()))
newData := make([]types.Datum, len(e.SelectExec.Fields()))
for i, f := range e.SelectExec.Fields() {
data[i] = types.NewDatum(f.Expr.GetValue())
newData[i] = data[i]
if e.OrderedList[i] != nil {
val, err := evaluator.Eval(e.ctx, e.OrderedList[i].Expr)
if err != nil {
return errors.Trace(err)
}
newData[i] = types.NewDatum(val)
}
}
row.Data = data
e.rows = append(e.rows, row)
e.newRowsData = append(e.newRowsData, newData)
}
}
示例6: TestCast
func (s *testEvaluatorSuite) TestCast(c *C) {
defer testleak.AfterTest(c)()
f := types.NewFieldType(mysql.TypeLonglong)
expr := &ast.FuncCastExpr{
Expr: ast.NewValueExpr(1),
Tp: f,
}
ast.SetFlag(expr)
v, err := Eval(s.ctx, expr)
c.Assert(err, IsNil)
c.Assert(v, testutil.DatumEquals, types.NewDatum(int64(1)))
f.Flag |= mysql.UnsignedFlag
v, err = Eval(s.ctx, expr)
c.Assert(err, IsNil)
c.Assert(v, testutil.DatumEquals, types.NewDatum(uint64(1)))
f.Tp = mysql.TypeString
f.Charset = charset.CharsetBin
v, err = Eval(s.ctx, expr)
c.Assert(err, IsNil)
c.Assert(v, testutil.DatumEquals, types.NewDatum([]byte("1")))
f.Tp = mysql.TypeString
f.Charset = "utf8"
v, err = Eval(s.ctx, expr)
c.Assert(err, IsNil)
c.Assert(v, testutil.DatumEquals, types.NewDatum("1"))
expr.Expr = ast.NewValueExpr(nil)
v, err = Eval(s.ctx, expr)
c.Assert(err, IsNil)
c.Assert(v.Kind(), Equals, types.KindNull)
}
示例7: getHashKey
// getHashKey encodes a requiredProperty to a unique hash code.
func (p *requiredProperty) getHashKey() ([]byte, error) {
datums := make([]types.Datum, 0, len(p.props)*3+1)
datums = append(datums, types.NewDatum(p.sortKeyLen))
for _, c := range p.props {
datums = append(datums, types.NewDatum(c.desc), types.NewDatum(c.col.FromID), types.NewDatum(c.col.Index))
}
bytes, err := codec.EncodeValue(nil, datums...)
return bytes, errors.Trace(err)
}
示例8: Next
// Next implements the Executor Next interface.
func (e *ApplyExec) Next() (*Row, error) {
srcRow, err := e.Src.Next()
if err != nil {
return nil, errors.Trace(err)
}
if srcRow == nil {
return nil, nil
}
for {
for _, col := range e.outerSchema {
idx := col.Index
*col.Data = srcRow.Data[idx]
}
innerRow, err := e.innerExec.Next()
if err != nil {
return nil, errors.Trace(err)
}
trimLen := len(srcRow.Data)
if innerRow != nil {
srcRow.Data = append(srcRow.Data, innerRow.Data...)
}
if e.checker == nil {
e.innerExec.Close()
return srcRow, nil
}
if innerRow == nil {
// When inner exec finishes, we need to append a result column to true, false or NULL.
var result types.Datum
if e.checker.all {
result = types.NewDatum(true)
} else {
// If 'any' meets a null value, the result will be null.
if e.checker.dataHasNull {
result = types.NewDatum(nil)
} else {
result = types.NewDatum(false)
}
}
srcRow.Data = append(srcRow.Data, result)
e.checker.reset()
e.innerExec.Close()
return srcRow, nil
}
finished, data, err := e.checker.check(srcRow.Data)
if err != nil {
return nil, errors.Trace(err)
}
srcRow.Data = srcRow.Data[:trimLen]
if finished {
e.checker.reset()
e.innerExec.Close()
srcRow.Data = append(srcRow.Data, data)
return srcRow, nil
}
}
}
示例9: TestTrim
func (s *testEvaluatorSuite) TestTrim(c *C) {
defer testleak.AfterTest(c)()
tbl := []struct {
str interface{}
remstr interface{}
dir ast.TrimDirectionType
result interface{}
}{
{" bar ", nil, ast.TrimBothDefault, "bar"},
{"xxxbarxxx", "x", ast.TrimLeading, "barxxx"},
{"xxxbarxxx", "x", ast.TrimBoth, "bar"},
{"barxxyz", "xyz", ast.TrimTrailing, "barx"},
{nil, "xyz", ast.TrimBoth, nil},
{1, 2, ast.TrimBoth, "1"},
{" \t\rbar\n ", nil, ast.TrimBothDefault, "bar"},
}
ctx := mock.NewContext()
for _, v := range tbl {
f := &ast.FuncCallExpr{
FnName: model.NewCIStr("TRIM"),
Args: []ast.ExprNode{
ast.NewValueExpr(v.str),
ast.NewValueExpr(v.remstr),
ast.NewValueExpr(v.dir),
},
}
r, err := Eval(ctx, f)
c.Assert(err, IsNil)
c.Assert(r, testutil.DatumEquals, types.NewDatum(v.result))
}
for _, v := range []struct {
str, result interface{}
fn string
}{
{" ", "", "LTRIM"},
{" ", "", "RTRIM"},
{"foo0", "foo0", "LTRIM"},
{"bar0", "bar0", "RTRIM"},
{" foo1", "foo1", "LTRIM"},
{"bar1 ", "bar1", "RTRIM"},
{spaceChars + "foo2 ", "foo2 ", "LTRIM"},
{" bar2" + spaceChars, " bar2", "RTRIM"},
{nil, nil, "LTRIM"},
{nil, nil, "RTRIM"},
} {
f := &ast.FuncCallExpr{
FnName: model.NewCIStr(v.fn),
Args: []ast.ExprNode{ast.NewValueExpr(v.str)},
}
r, err := Eval(ctx, f)
c.Assert(err, IsNil)
c.Assert(r, testutil.DatumEquals, types.NewDatum(v.result))
}
}
示例10: TestCoalesce
func (s *testEvaluatorSuite) TestCoalesce(c *C) {
args := types.MakeDatums(1, nil)
v, err := builtinCoalesce(args, nil)
c.Assert(err, IsNil)
c.Assert(v, DatumEquals, types.NewDatum(1))
args = types.MakeDatums(nil, nil)
v, err = builtinCoalesce(args, nil)
c.Assert(err, IsNil)
c.Assert(v, DatumEquals, types.NewDatum(nil))
}
示例11: TestCoalesce
func (s *testEvaluatorSuite) TestCoalesce(c *C) {
defer testleak.AfterTest(c)()
args := types.MakeDatums(1, nil)
v, err := builtinCoalesce(args, nil)
c.Assert(err, IsNil)
c.Assert(v, testutil.DatumEquals, types.NewDatum(1))
args = types.MakeDatums(nil, nil)
v, err = builtinCoalesce(args, nil)
c.Assert(err, IsNil)
c.Assert(v, testutil.DatumEquals, types.NewDatum(nil))
}
示例12: inExpr
func inExpr(target interface{}, list ...interface{}) *tipb.Expr {
targetDatum := types.NewDatum(target)
var listDatums []types.Datum
for _, v := range list {
listDatums = append(listDatums, types.NewDatum(v))
}
types.SortDatums(listDatums)
targetExpr := datumExpr(targetDatum)
val, _ := codec.EncodeValue(nil, listDatums...)
listExpr := &tipb.Expr{Tp: tipb.ExprType_ValueList, Val: val}
return &tipb.Expr{Tp: tipb.ExprType_In, Children: []*tipb.Expr{targetExpr, listExpr}}
}
示例13: Next
// Next implements Executor Next interface.
func (e *ApplyExec) Next() (*Row, error) {
srcRow, err := e.Src.Next()
if err != nil {
return nil, errors.Trace(err)
}
if srcRow == nil {
return nil, nil
}
for {
for _, col := range e.outerSchema {
idx := col.Index
col.SetValue(&srcRow.Data[idx])
}
innerRow, err := e.innerExec.Next()
if err != nil {
return nil, errors.Trace(err)
}
trimLen := len(srcRow.Data)
if innerRow != nil {
srcRow.Data = append(srcRow.Data, innerRow.Data...)
}
if e.checker == nil {
e.innerExec.Close()
return srcRow, nil
}
if innerRow == nil {
var d types.Datum
// If we can't determine the result until the last row comes, the all must be true and any must not be true.
// If the any have met a null, the result will be null.
if e.checker.dataHasNull && !e.checker.all {
d = types.NewDatum(nil)
} else {
d = types.NewDatum(e.checker.all)
}
srcRow.Data = append(srcRow.Data, d)
e.checker.dataHasNull = false
e.innerExec.Close()
return srcRow, nil
}
finished, data, err := e.checker.Check(srcRow.Data)
if err != nil {
return nil, errors.Trace(err)
}
srcRow.Data = srcRow.Data[:trimLen]
if finished {
e.checker.dataHasNull = false
e.innerExec.Close()
srcRow.Data = append(srcRow.Data, data)
return srcRow, nil
}
}
}
示例14: buildTableRanges
func (r *rangeBuilder) buildTableRanges(rangePoints []rangePoint) []TableRange {
tableRanges := make([]TableRange, 0, len(rangePoints)/2)
for i := 0; i < len(rangePoints); i += 2 {
startPoint := rangePoints[i]
if startPoint.value.IsNull() || startPoint.value.Kind() == types.KindMinNotNull {
startPoint.value.SetInt64(math.MinInt64)
}
startInt, err := startPoint.value.ToInt64()
if err != nil {
r.err = errors.Trace(err)
return tableRanges
}
startDatum := types.NewDatum(startInt)
cmp, err := startDatum.CompareDatum(startPoint.value)
if err != nil {
r.err = errors.Trace(err)
return tableRanges
}
if cmp < 0 || (cmp == 0 && startPoint.excl) {
startInt++
}
endPoint := rangePoints[i+1]
if endPoint.value.IsNull() {
endPoint.value.SetInt64(math.MinInt64)
} else if endPoint.value.Kind() == types.KindMaxValue {
endPoint.value.SetInt64(math.MaxInt64)
}
endInt, err := endPoint.value.ToInt64()
if err != nil {
r.err = errors.Trace(err)
return tableRanges
}
endDatum := types.NewDatum(endInt)
cmp, err = endDatum.CompareDatum(endPoint.value)
if err != nil {
r.err = errors.Trace(err)
return tableRanges
}
if cmp > 0 || (cmp == 0 && endPoint.excl) {
endInt--
}
if startInt > endInt {
continue
}
tableRanges = append(tableRanges, TableRange{LowVal: startInt, HighVal: endInt})
}
return tableRanges
}
示例15: TestExpression
func (s *testExpressionSuite) TestExpression(c *C) {
defer testleak.AfterTest(c)()
var schema Schema
for i := 0; i < 3; i++ {
schema = append(schema, &Column{ColName: model.NewCIStr("t"), FromID: "mock", Position: i})
}
tc1 := &Column{FromID: "t", ColName: model.NewCIStr("c1")}
kc1 := &Column{FromID: "k", ColName: model.NewCIStr("c1")}
tc2 := &Column{FromID: "t", ColName: model.NewCIStr("c2")}
con := &Constant{Value: types.NewDatum(10)}
col := &ast.ColumnName{Name: model.NewCIStr("t")}
// t.c1 as t, t.c2 as t, 10 as t => error
index, err := getColIndex([]Expression{tc1, tc2, con}, schema, col)
c.Check(err, NotNil)
// t.c1 as t, 10 as t, t.c2 as t => 10
index, err = getColIndex([]Expression{tc1, con, tc2}, schema, col)
c.Assert(index, Equals, 1)
// t.c1 as t, t.c1 as t, 10 as t => 10
index, err = getColIndex([]Expression{tc1, tc1, con}, schema, col)
c.Assert(index, Equals, 2)
// t.c1 as t, k.c1 as t, 10 as t => error
index, err = getColIndex([]Expression{tc1, kc1, con}, schema, col)
c.Check(err, NotNil)
}