當前位置: 首頁>>代碼示例>>Golang>>正文


Golang evaluator.Eval函數代碼示例

本文整理匯總了Golang中github.com/pingcap/tidb/evaluator.Eval函數的典型用法代碼示例。如果您正苦於以下問題:Golang Eval函數的具體用法?Golang Eval怎麽用?Golang Eval使用的例子?那麽, 這裏精選的函數代碼示例或許可以為您提供幫助。


在下文中一共展示了Eval函數的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。

示例1: onDuplicateUpdate

func (e *InsertExec) onDuplicateUpdate(row []types.Datum, h int64, cols map[int]*ast.Assignment) error {
    // On duplicate key update the duplicate row.
    // Evaluate the updated value.
    // TODO: report rows affected and last insert id.
    data, err := e.Table.Row(e.ctx, h)
    if err != nil {
        return errors.Trace(err)
    }
    // For evaluate ValuesExpr
    // http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values
    for i, rf := range e.fields {
        rf.Expr.SetValue(row[i].GetValue())
    }
    // Evaluate assignment
    newData := make([]types.Datum, len(data))
    for i, c := range row {
        asgn, ok := cols[i]
        if !ok {
            newData[i] = c
            continue
        }
        val, err1 := evaluator.Eval(e.ctx, asgn.Expr)
        if err1 != nil {
            return errors.Trace(err1)
        }
        newData[i] = val
    }
    if err = updateRecord(e.ctx, h, data, newData, cols, e.Table, 0, true); err != nil {
        return errors.Trace(err)
    }
    return nil
}
開發者ID:XuHuaiyu,項目名稱:tidb,代碼行數:32,代碼來源:executor_write.go

示例2: Next

// Next implements Executor Next interface.
func (e *SelectFieldsExec) Next() (*Row, error) {
    var rowKeys []*RowKeyEntry
    if e.Src != nil {
        srcRow, err := e.Src.Next()
        if err != nil {
            return nil, errors.Trace(err)
        }
        if srcRow == nil {
            return nil, nil
        }
        rowKeys = srcRow.RowKeys
    } else {
        // If Src is nil, only one row should be returned.
        if e.executed {
            return nil, nil
        }
    }
    e.executed = true
    row := &Row{
        RowKeys: rowKeys,
        Data:    make([]types.Datum, len(e.ResultFields)),
    }
    for i, field := range e.ResultFields {
        val, err := evaluator.Eval(e.ctx, field.Expr)
        if err != nil {
            return nil, errors.Trace(err)
        }
        row.Data[i] = val
    }
    return row, nil
}
開發者ID:XuHuaiyu,項目名稱:tidb,代碼行數:32,代碼來源:executor.go

示例3: getDefaultValue

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()
}
開發者ID:pingcap,項目名稱:tidb,代碼行數:29,代碼來源:ddl.go

示例4: Next

// Next implements Executor Next interface.
func (e *SortExec) Next() (*Row, error) {
    if !e.fetched {
        for {
            srcRow, err := e.Src.Next()
            if err != nil {
                return nil, errors.Trace(err)
            }
            if srcRow == nil {
                break
            }
            orderRow := &orderByRow{
                row: srcRow,
                key: make([]interface{}, len(e.ByItems)),
            }
            for i, byItem := range e.ByItems {
                orderRow.key[i], err = evaluator.Eval(e.ctx, byItem.Expr)
                if err != nil {
                    return nil, errors.Trace(err)
                }
            }
            e.Rows = append(e.Rows, orderRow)
        }
        sort.Sort(e)
        e.fetched = true
    }
    if e.err != nil {
        return nil, errors.Trace(e.err)
    }
    if e.Idx >= len(e.Rows) {
        return nil, nil
    }
    row := e.Rows[e.Idx].row
    e.Idx++
    return row, nil
}
開發者ID:astaxie,項目名稱:tidb,代碼行數:36,代碼來源:executor.go

示例5: getRow

func (e *InsertValues) getRow(cols []*table.Column, list []ast.ExprNode, defaultVals map[string]types.Datum) ([]types.Datum, error) {
    vals := make([]types.Datum, len(list))
    var err error
    for i, expr := range list {
        if d, ok := expr.(*ast.DefaultExpr); ok {
            cn := d.Name
            if cn == nil {
                vals[i] = defaultVals[cols[i].Name.L]
                continue
            }
            var found bool
            vals[i], found = defaultVals[cn.Name.L]
            if !found {
                return nil, errors.Errorf("default column not found - %s", cn.Name.O)
            }
        } else {
            var val types.Datum
            val, err = evaluator.Eval(e.ctx, expr)
            vals[i] = val
            if err != nil {
                return nil, errors.Trace(err)
            }
        }
    }
    return e.fillRowData(cols, vals, false)
}
開發者ID:pingcap,項目名稱:tidb,代碼行數:26,代碼來源:executor_write.go

示例6: 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] = val
            }
        }
        row.Data = data
        e.rows = append(e.rows, row)
        e.newRowsData = append(e.newRowsData, newData)
    }
}
開發者ID:XuHuaiyu,項目名稱:tidb,代碼行數:27,代碼來源:executor_write.go

示例7: executeDo

func (e *SimpleExec) executeDo(s *ast.DoStmt) error {
    for _, expr := range s.Exprs {
        _, err := evaluator.Eval(e.ctx, expr)
        if err != nil {
            return errors.Trace(err)
        }
    }
    return nil
}
開發者ID:yubobo,項目名稱:tidb,代碼行數:9,代碼來源:executor_simple.go

示例8: Build

// Build builds a prepared statement into an executor.
func (e *ExecuteExec) Build() error {
    vars := variable.GetSessionVars(e.Ctx)
    if e.Name != "" {
        e.ID = vars.PreparedStmtNameToID[e.Name]
    }
    v := vars.PreparedStmts[e.ID]
    if v == nil {
        return ErrStmtNotFound
    }
    prepared := v.(*Prepared)

    if len(prepared.Params) != len(e.UsingVars) {
        return ErrWrongParamCount
    }

    for i, usingVar := range e.UsingVars {
        val, err := evaluator.Eval(e.Ctx, usingVar)
        if err != nil {
            return errors.Trace(err)
        }
        prepared.Params[i].SetDatum(val)
    }

    ast.ResetEvaluatedFlag(prepared.Stmt)
    if prepared.SchemaVersion != e.IS.SchemaMetaVersion() {
        // If the schema version has changed we need to prepare it again,
        // if this time it failed, the real reason for the error is schema changed.
        err := plan.PrepareStmt(e.IS, e.Ctx, prepared.Stmt)
        if err != nil {
            return ErrSchemaChanged.Gen("Schema change casued error: %s", err.Error())
        }
        prepared.SchemaVersion = e.IS.SchemaMetaVersion()
    }
    sb := &subqueryBuilder{is: e.IS}
    p, err := plan.Optimize(e.Ctx, prepared.Stmt, sb, e.IS)
    if err != nil {
        return errors.Trace(err)
    }
    b := newExecutorBuilder(e.Ctx, e.IS)
    stmtExec := b.build(p)
    if b.err != nil {
        return errors.Trace(b.err)
    }
    e.StmtExec = stmtExec
    e.Stmt = prepared.Stmt
    return nil
}
開發者ID:anywhy,項目名稱:tidb,代碼行數:48,代碼來源:prepared.go

示例9: getGroupKey

func (e *AggregateExec) getGroupKey() ([]byte, error) {
    if len(e.GroupByItems) == 0 {
        return singleGroup, nil
    }
    vals := make([]types.Datum, 0, len(e.GroupByItems))
    for _, item := range e.GroupByItems {
        v, err := evaluator.Eval(e.ctx, item.Expr)
        if err != nil {
            return nil, errors.Trace(err)
        }
        vals = append(vals, v)
    }
    bs, err := codec.EncodeValue([]byte{}, vals...)
    if err != nil {
        return nil, errors.Trace(err)
    }
    return bs, nil
}
開發者ID:XuHuaiyu,項目名稱:tidb,代碼行數:18,代碼來源:executor.go

示例10: getVarValue

func (e *SimpleExec) getVarValue(v *ast.VariableAssignment, sysVar *variable.SysVar, globalVars variable.GlobalVarAccessor) (value types.Datum, err error) {
    switch v.Value.(type) {
    case *ast.DefaultExpr:
        // To set a SESSION variable to the GLOBAL value or a GLOBAL value
        // to the compiled-in MySQL default value, use the DEFAULT keyword.
        // See http://dev.mysql.com/doc/refman/5.7/en/set-statement.html
        if sysVar != nil {
            value = types.NewStringDatum(sysVar.Value)
        } else {
            s, err1 := globalVars.GetGlobalSysVar(e.ctx, strings.ToLower(v.Name))
            if err1 != nil {
                return value, errors.Trace(err1)
            }
            value = types.NewStringDatum(s)
        }
    default:
        value, err = evaluator.Eval(e.ctx, v.Value)
    }
    return value, errors.Trace(err)
}
開發者ID:XuHuaiyu,項目名稱:tidb,代碼行數:20,代碼來源:executor_simple.go

示例11: onDuplicateUpdate

// onDuplicateUpdate updates the duplicate row.
// TODO: Report rows affected and last insert id.
func (e *InsertExec) onDuplicateUpdate(row []types.Datum, h int64, cols map[int]*ast.Assignment) error {
    data, err := e.Table.Row(e.ctx, h)
    if err != nil {
        return errors.Trace(err)
    }

    // for evaluating ColumnNameExpr
    for i, rf := range e.fields {
        rf.Expr.SetValue(data[i].GetValue())
    }
    // for evaluating ValuesExpr
    // See http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values
    e.ctx.GetSessionVars().CurrInsertValues = row
    // evaluate assignment
    newData := make([]types.Datum, len(data))
    for i, c := range row {
        asgn, ok := cols[i]
        if !ok {
            newData[i] = c
            continue
        }
        val, err1 := evaluator.Eval(e.ctx, asgn.Expr)
        if err1 != nil {
            return errors.Trace(err1)
        }
        newData[i] = val
    }

    assignFlag := make([]bool, len(e.Table.Cols()))
    for i, asgn := range cols {
        if asgn != nil {
            assignFlag[i] = true
        } else {
            assignFlag[i] = false
        }
    }
    if err = updateRecord(e.ctx, h, data, newData, assignFlag, e.Table, 0, true); err != nil {
        return errors.Trace(err)
    }
    return nil
}
開發者ID:pingcap,項目名稱:tidb,代碼行數:43,代碼來源:executor_write.go

示例12: Leave

func (r *preEvaluator) Leave(in ast.Node) (ast.Node, bool) {
    if expr, ok := in.(ast.ExprNode); ok {
        if _, ok = expr.(*ast.ValueExpr); ok {
            return in, true
        } else if ast.IsPreEvaluable(expr) {
            val, err := evaluator.Eval(r.ctx, expr)
            if err != nil {
                r.err = err
                return in, false
            }
            if ast.IsConstant(expr) {
                // The expression is constant, rewrite the expression to value expression.
                valExpr := &ast.ValueExpr{}
                valExpr.SetText(expr.Text())
                valExpr.SetType(expr.GetType())
                valExpr.SetDatum(val)
                return valExpr, true
            }
            expr.SetDatum(val)
        }
    }
    return in, true
}
開發者ID:XuHuaiyu,項目名稱:tidb,代碼行數:23,代碼來源:logic.go

示例13: innerNext

// Fetch a single row from src and update each aggregate function.
// If the first return value is false, it means there is no more data from src.
func (e *AggregateExec) innerNext() (bool, error) {
    if e.Src != nil {
        srcRow, err := e.Src.Next()
        if err != nil {
            return false, errors.Trace(err)
        }
        if srcRow == nil {
            return false, nil
        }
    } else {
        // If Src is nil, only one row should be returned.
        if e.executed {
            return false, nil
        }
    }
    e.executed = true
    groupKey, err := e.getGroupKey()
    if err != nil {
        return false, errors.Trace(err)
    }
    if _, ok := e.groupMap[string(groupKey)]; !ok {
        e.groupMap[string(groupKey)] = true
        e.groups = append(e.groups, groupKey)
    }
    for _, af := range e.AggFuncs {
        for _, arg := range af.Args {
            _, err := evaluator.Eval(e.ctx, arg)
            if err != nil {
                return false, errors.Trace(err)
            }
        }
        af.CurrentGroup = groupKey
        af.Update()
    }
    return true, nil
}
開發者ID:XuHuaiyu,項目名稱:tidb,代碼行數:38,代碼來源:executor.go

示例14: TestCount

func (s *testAggFuncSuite) TestCount(c *C) {
    // Compose aggregate exec for "select c1, count(c2) from t";
    // c1  c2
    // 1	1
    // 2	1
    // 3    nil
    c1 := ast.NewValueExpr(0)
    rf1 := &ast.ResultField{Expr: c1}
    col1 := &ast.ColumnNameExpr{Refer: rf1}
    fc1 := &ast.AggregateFuncExpr{
        F:    ast.AggFuncFirstRow,
        Args: []ast.ExprNode{col1},
    }
    c2 := ast.NewValueExpr(0)
    rf2 := &ast.ResultField{Expr: c2}
    col2 := &ast.ColumnNameExpr{Refer: rf2}
    fc2 := &ast.AggregateFuncExpr{
        F:    ast.AggFuncCount,
        Args: []ast.ExprNode{col2},
    }
    row1 := types.MakeDatums(1, 1)
    row2 := types.MakeDatums(2, 1)
    row3 := types.MakeDatums(3, nil)
    data := []([]types.Datum){row1, row2, row3}

    rows := make([]*Row, 0, 3)
    for _, d := range data {
        rows = append(rows, &Row{Data: d})
    }
    src := &mockExec{
        rows:   rows,
        fields: []*ast.ResultField{rf1, rf2},
    }
    agg := &AggregateExec{
        AggFuncs: []*ast.AggregateFuncExpr{fc1, fc2},
        Src:      src,
    }
    var (
        row *Row
        cnt int
    )
    for {
        r, err := agg.Next()
        c.Assert(err, IsNil)
        if r == nil {
            break
        }
        row = r
        cnt++
    }
    c.Assert(cnt, Equals, 1)
    c.Assert(row, NotNil)
    ctx := mock.NewContext()
    val, err := evaluator.Eval(ctx, fc1)
    c.Assert(err, IsNil)
    c.Assert(val, Equals, int64(1))
    val, err = evaluator.Eval(ctx, fc2)
    c.Assert(err, IsNil)
    c.Assert(val, Equals, int64(2))

    agg.Close()
    val, err = evaluator.Eval(ctx, fc1)
    c.Assert(err, IsNil)
    c.Assert(val, IsNil)
    val, err = evaluator.Eval(ctx, fc2)
    c.Assert(err, IsNil)
    c.Assert(val, Equals, int64(0))
}
開發者ID:astaxie,項目名稱:tidb,代碼行數:68,代碼來源:aggregate_test.go

示例15: columnDefToCol

// columnDefToCol converts ColumnDef to Col and TableConstraints.
func columnDefToCol(ctx context.Context, offset int, colDef *ast.ColumnDef) (*table.Column, []*ast.Constraint, error) {
    constraints := []*ast.Constraint{}
    col := &table.Column{
        Offset:    offset,
        Name:      colDef.Name.Name,
        FieldType: *colDef.Tp,
    }

    // Check and set TimestampFlag and OnUpdateNowFlag.
    if col.Tp == mysql.TypeTimestamp {
        col.Flag |= mysql.TimestampFlag
        col.Flag |= mysql.OnUpdateNowFlag
        col.Flag |= mysql.NotNullFlag
    }

    setOnUpdateNow := false
    hasDefaultValue := false
    if colDef.Options != nil {
        keys := []*ast.IndexColName{
            {
                Column: colDef.Name,
                Length: colDef.Tp.Flen,
            },
        }
        for _, v := range colDef.Options {
            switch v.Tp {
            case ast.ColumnOptionNotNull:
                col.Flag |= mysql.NotNullFlag
            case ast.ColumnOptionNull:
                col.Flag &= ^uint(mysql.NotNullFlag)
                removeOnUpdateNowFlag(col)
            case ast.ColumnOptionAutoIncrement:
                col.Flag |= mysql.AutoIncrementFlag
            case ast.ColumnOptionPrimaryKey:
                constraint := &ast.Constraint{Tp: ast.ConstraintPrimaryKey, Keys: keys}
                constraints = append(constraints, constraint)
                col.Flag |= mysql.PriKeyFlag
            case ast.ColumnOptionUniq:
                constraint := &ast.Constraint{Tp: ast.ConstraintUniq, Name: colDef.Name.Name.O, Keys: keys}
                constraints = append(constraints, constraint)
                col.Flag |= mysql.UniqueKeyFlag
            case ast.ColumnOptionIndex:
                constraint := &ast.Constraint{Tp: ast.ConstraintIndex, Name: colDef.Name.Name.O, Keys: keys}
                constraints = append(constraints, constraint)
            case ast.ColumnOptionUniqIndex:
                constraint := &ast.Constraint{Tp: ast.ConstraintUniqIndex, Name: colDef.Name.Name.O, Keys: keys}
                constraints = append(constraints, constraint)
                col.Flag |= mysql.UniqueKeyFlag
            case ast.ColumnOptionKey:
                constraint := &ast.Constraint{Tp: ast.ConstraintKey, Name: colDef.Name.Name.O, Keys: keys}
                constraints = append(constraints, constraint)
            case ast.ColumnOptionUniqKey:
                constraint := &ast.Constraint{Tp: ast.ConstraintUniqKey, Name: colDef.Name.Name.O, Keys: keys}
                constraints = append(constraints, constraint)
                col.Flag |= mysql.UniqueKeyFlag
            case ast.ColumnOptionDefaultValue:
                value, err := getDefaultValue(ctx, v, colDef.Tp.Tp, colDef.Tp.Decimal)
                if err != nil {
                    return nil, nil, ErrColumnBadNull.Gen("invalid default value - %s", err)
                }
                col.DefaultValue = value
                hasDefaultValue = true
                removeOnUpdateNowFlag(col)
            case ast.ColumnOptionOnUpdate:
                if !evaluator.IsCurrentTimeExpr(v.Expr) {
                    return nil, nil, ErrInvalidOnUpdate.Gen("invalid ON UPDATE for - %s", col.Name)
                }

                col.Flag |= mysql.OnUpdateNowFlag
                setOnUpdateNow = true
            case ast.ColumnOptionComment:
                value, err := evaluator.Eval(ctx, v.Expr)
                if err != nil {
                    return nil, nil, errors.Trace(err)
                }
                col.Comment, err = value.ToString()
                if err != nil {
                    return nil, nil, errors.Trace(err)
                }
            case ast.ColumnOptionFulltext:
                // Do nothing.
            }
        }
    }

    setTimestampDefaultValue(col, hasDefaultValue, setOnUpdateNow)

    // Set `NoDefaultValueFlag` if this field doesn't have a default value and
    // it is `not null` and not an `AUTO_INCREMENT` field or `TIMESTAMP` field.
    setNoDefaultValueFlag(col, hasDefaultValue)

    err := checkDefaultValue(col, hasDefaultValue)
    if err != nil {
        return nil, nil, errors.Trace(err)
    }
    if col.Charset == charset.CharsetBin {
        col.Flag |= mysql.BinaryFlag
    }
    return col, constraints, nil
//.........這裏部分代碼省略.........
開發者ID:pingcap,項目名稱:tidb,代碼行數:101,代碼來源:ddl.go


注:本文中的github.com/pingcap/tidb/evaluator.Eval函數示例由純淨天空整理自Github/MSDocs等開源代碼及文檔管理平台,相關代碼片段篩選自各路編程大神貢獻的開源項目,源碼版權歸原作者所有,傳播和使用請參考對應項目的License;未經允許,請勿轉載。