Skip to content

Commit

Permalink
*: make parser package dependency as small as possible (#7989)
Browse files Browse the repository at this point in the history
  • Loading branch information
tiancaiamao authored and zz-jason committed Oct 24, 2018
1 parent 2040791 commit bd08b0b
Show file tree
Hide file tree
Showing 18 changed files with 472 additions and 313 deletions.
2 changes: 1 addition & 1 deletion ast/ast.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import (
"io"

"github.com/pingcap/tidb/model"
"github.com/pingcap/tidb/types"
"github.com/pingcap/tidb/parser/types"
)

// Node is the basic element of the AST.
Expand Down
2 changes: 1 addition & 1 deletion ast/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

package ast

import "github.com/pingcap/tidb/types"
import "github.com/pingcap/tidb/parser/types"

// node is the struct implements node interface except for Accept method.
// Node implementations should embed it in.
Expand Down
2 changes: 1 addition & 1 deletion ast/ddl.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ package ast

import (
"github.com/pingcap/tidb/model"
"github.com/pingcap/tidb/types"
"github.com/pingcap/tidb/parser/types"
)

var (
Expand Down
2 changes: 1 addition & 1 deletion ast/functions.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (
"io"

"github.com/pingcap/tidb/model"
"github.com/pingcap/tidb/types"
"github.com/pingcap/tidb/parser/types"
)

var (
Expand Down
9 changes: 9 additions & 0 deletions ast/misc.go
Original file line number Diff line number Diff line change
Expand Up @@ -868,3 +868,12 @@ func (n *TableOptimizerHint) Accept(v Visitor) (Node, bool) {
n = newNode.(*TableOptimizerHint)
return v.Leave(n)
}

// NewDecimal creates a types.Decimal value, it's provided by parser driver.
var NewDecimal func(string) (interface{}, error)

// NewHexLiteral creates a types.HexLiteral value, it's provided by parser driver.
var NewHexLiteral func(string) (interface{}, error)

// NewBitLiteral creates a types.BitLiteral value, it's provided by parser driver.
var NewBitLiteral func(string) (interface{}, error)
5 changes: 2 additions & 3 deletions model/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ import (
"time"

"github.com/pingcap/tidb/mysql"
"github.com/pingcap/tidb/types"
"github.com/pingcap/tidb/util/hack"
"github.com/pingcap/tidb/parser/types"
"github.com/pingcap/tipb/go-tipb"
"github.com/pkg/errors"
)
Expand Down Expand Up @@ -113,7 +112,7 @@ func (c *ColumnInfo) SetDefaultValue(value interface{}) error {
// bit type default value will store in DefaultValueBit for fix bit default value decode/encode bug.
func (c *ColumnInfo) GetDefaultValue() interface{} {
if c.Tp == mysql.TypeBit && c.DefaultValueBit != nil {
return hack.String(c.DefaultValueBit)
return string(c.DefaultValueBit)
}
return c.DefaultValue
}
Expand Down
3 changes: 1 addition & 2 deletions parser/misc.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import (
"strings"

"github.com/pingcap/tidb/util/charset"
"github.com/pingcap/tidb/util/hack"
)

func isLetter(ch rune) bool {
Expand Down Expand Up @@ -584,7 +583,7 @@ func (s *Scanner) isTokenIdentifier(lit string, offset int) int {
}
}

checkBtFuncToken, tokenStr := false, hack.String(data)
checkBtFuncToken, tokenStr := false, string(data)
if s.r.peek() == '(' {
checkBtFuncToken = true
} else if s.sqlMode.HasIgnoreSpaceMode() {
Expand Down
2 changes: 1 addition & 1 deletion parser/parser.y
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import (
"github.com/pingcap/tidb/parser/opcode"
"github.com/pingcap/tidb/util/auth"
"github.com/pingcap/tidb/util/charset"
"github.com/pingcap/tidb/types"
"github.com/pingcap/tidb/parser/types"
)

%}
Expand Down
112 changes: 112 additions & 0 deletions parser/types/etc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
// Copyright 2014 The ql Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSES/QL-LICENSE file.

// Copyright 2015 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// See the License for the specific language governing permissions and
// limitations under the License.

package types

import (
"strings"

"github.com/pingcap/tidb/mysql"
"github.com/pingcap/tidb/terror"
)

// IsTypeBlob returns a boolean indicating whether the tp is a blob type.
func IsTypeBlob(tp byte) bool {
switch tp {
case mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeBlob, mysql.TypeLongBlob:
return true
default:
return false
}
}

// IsTypeChar returns a boolean indicating
// whether the tp is the char type like a string type or a varchar type.
func IsTypeChar(tp byte) bool {
return tp == mysql.TypeString || tp == mysql.TypeVarchar
}

var type2Str = map[byte]string{
mysql.TypeBit: "bit",
mysql.TypeBlob: "text",
mysql.TypeDate: "date",
mysql.TypeDatetime: "datetime",
mysql.TypeDecimal: "unspecified",
mysql.TypeNewDecimal: "decimal",
mysql.TypeDouble: "double",
mysql.TypeEnum: "enum",
mysql.TypeFloat: "float",
mysql.TypeGeometry: "geometry",
mysql.TypeInt24: "mediumint",
mysql.TypeJSON: "json",
mysql.TypeLong: "int",
mysql.TypeLonglong: "bigint",
mysql.TypeLongBlob: "longtext",
mysql.TypeMediumBlob: "mediumtext",
mysql.TypeNull: "null",
mysql.TypeSet: "set",
mysql.TypeShort: "smallint",
mysql.TypeString: "char",
mysql.TypeDuration: "time",
mysql.TypeTimestamp: "timestamp",
mysql.TypeTiny: "tinyint",
mysql.TypeTinyBlob: "tinytext",
mysql.TypeVarchar: "varchar",
mysql.TypeVarString: "var_string",
mysql.TypeYear: "year",
}

// TypeStr converts tp to a string.
func TypeStr(tp byte) (r string) {
return type2Str[tp]
}

// TypeToStr converts a field to a string.
// It is used for converting Text to Blob,
// or converting Char to Binary.
// Args:
// tp: type enum
// cs: charset
func TypeToStr(tp byte, cs string) (r string) {
ts := type2Str[tp]
if cs != "binary" {
return ts
}
if IsTypeBlob(tp) {
ts = strings.Replace(ts, "text", "blob", 1)
} else if IsTypeChar(tp) {
ts = strings.Replace(ts, "char", "binary", 1)
}
return ts
}

var (
dig2bytes = [10]int{0, 1, 1, 2, 2, 3, 3, 4, 4, 4}
)

// constant values.
const (
digitsPerWord = 9 // A word holds 9 digits.
wordSize = 4 // A word is 4 bytes int32.
)

const (
codeInvalidDefault = terror.ErrCode(mysql.ErrInvalidDefault)
)

// ErrInvalidDefault is returned when meet a invalid default value.
var ErrInvalidDefault = terror.ClassTypes.New(codeInvalidDefault, "Invalid default value for '%s'")
42 changes: 42 additions & 0 deletions parser/types/eval_type.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// Copyright 2017 PingCAP, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// See the License for the specific language governing permissions and
// limitations under the License.

package types

// EvalType indicates the specified types that arguments and result of a built-in function should be.
type EvalType byte

const (
// ETInt represents type INT in evaluation.
ETInt EvalType = iota
// ETReal represents type REAL in evaluation.
ETReal
// ETDecimal represents type DECIMAL in evaluation.
ETDecimal
// ETString represents type STRING in evaluation.
ETString
// ETDatetime represents type DATETIME in evaluation.
ETDatetime
// ETTimestamp represents type TIMESTAMP in evaluation.
ETTimestamp
// ETDuration represents type DURATION in evaluation.
ETDuration
// ETJson represents type JSON in evaluation.
ETJson
)

// IsStringKind returns true for ETString, ETDatetime, ETTimestamp, ETDuration, ETJson EvalTypes.
func (et EvalType) IsStringKind() bool {
return et == ETString || et == ETDatetime ||
et == ETTimestamp || et == ETDuration || et == ETJson
}
Loading

0 comments on commit bd08b0b

Please sign in to comment.