sqltypes

package
Version: v0.0.0-...-275105e Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 20, 2017 License: Apache-2.0 Imports: 13 Imported by: 0

Documentation

Overview

Package sqltypes implements interfaces and types that represent SQL values.

Index

Constants

Vitess data types. These are idiomatically named synonyms for the querypb.Type values.

Variables

View Source
var (
	// NULL represents the NULL value.
	NULL = Value{}
	// DontEscape tells you if a character should not be escaped.
	DontEscape = byte(255)
)
View Source
var SQLDecodeMap [256]byte

SQLDecodeMap is the reverse of SQLEncodeMap

View Source
var SQLEncodeMap [256]byte

SQLEncodeMap specifies how to escape binary data with '\'. Complies to http://dev.mysql.com/doc/refman/5.1/en/string-syntax.html

Functions

func BindVariablesEqual

func BindVariablesEqual(x, y map[string]interface{}) bool

BindVariablesEqual compares two maps of bind variables. For protobuf messages we have to use "proto.Equal".

func EventTokenMinimum

func EventTokenMinimum(ev1, ev2 *querypb.EventToken) *querypb.EventToken

EventTokenMinimum returns an event token that is guaranteed to happen before both provided EventToken objects. Note it doesn't parse the position, but rather only uses the timestamp. This is meant to be used for EventToken objects coming from different source shard.

func FieldsEqual

func FieldsEqual(f1, f2 []*querypb.Field) bool

FieldsEqual compares two arrays of fields. reflect.DeepEqual shouldn't be used because of the protos.

func IncludeFieldsOrDefault

func IncludeFieldsOrDefault(options *querypb.ExecuteOptions) querypb.ExecuteOptions_IncludedFields

IncludeFieldsOrDefault normalizes the passed Execution Options. It returns the default value if options is nil.

func IsBinary

func IsBinary(t querypb.Type) bool

IsBinary returns true if querypb.Type is a binary.

func IsFloat

func IsFloat(t querypb.Type) bool

IsFloat returns true is querypb.Type is a floating point.

func IsIntegral

func IsIntegral(t querypb.Type) bool

IsIntegral returns true if querypb.Type is an integral (signed/unsigned) that can be represented using up to 64 binary bits.

func IsQuoted

func IsQuoted(t querypb.Type) bool

IsQuoted returns true if querypb.Type is a quoted text or binary.

func IsSigned

func IsSigned(t querypb.Type) bool

IsSigned returns true if querypb.Type is a signed integral.

func IsText

func IsText(t querypb.Type) bool

IsText returns true if querypb.Type is a text.

func IsTypeValid

func IsTypeValid(typ querypb.Type) bool

IsTypeValid returns true if the type is valid.

func IsUnsigned

func IsUnsigned(t querypb.Type) bool

IsUnsigned returns true if querypb.Type is an unsigned integral. Caution: this is not the same as !IsSigned.

func MySQLToType

func MySQLToType(mysqlType, flags int64) (typ querypb.Type, err error)

MySQLToType computes the vitess type from mysql type and flags.

func NullsafeCompare

func NullsafeCompare(v1, v2 Value) (int, error)

NullsafeCompare returns 0 if v1==v2, -1 if v1<v2, and 1 if v1>v2. NULL is the lowest value. If any value is numeric, then a numeric comparison is performed after necessary conversions. If none are numeric, then it's a simple binary comparison. Text values return an error.

func Proto3QueryResponsesEqual

func Proto3QueryResponsesEqual(r1, r2 []*querypb.ResultWithError) bool

Proto3QueryResponsesEqual compares two arrays of proto3 QueryResponse. reflect.DeepEqual shouldn't be used because of the protos.

func Proto3ResultsEqual

func Proto3ResultsEqual(r1, r2 []*querypb.QueryResult) bool

Proto3ResultsEqual compares two arrays of proto3 Result. reflect.DeepEqual shouldn't be used because of the protos.

func Proto3ValuesEqual

func Proto3ValuesEqual(v1, v2 []*querypb.Value) bool

Proto3ValuesEqual compares two arrays of proto3 Value.

func QueryResponsesEqual

func QueryResponsesEqual(r1, r2 []QueryResponse) bool

QueryResponsesEqual compares two arrays of QueryResponse. They contain protos, so we cannot use reflect.DeepEqual.

func QueryResponsesToProto3

func QueryResponsesToProto3(qr []QueryResponse) []*querypb.ResultWithError

QueryResponsesToProto3 converts []QueryResponse to proto3.

func ResultToProto3

func ResultToProto3(qr *Result) *querypb.QueryResult

ResultToProto3 converts Result to proto3.

func ResultsEqual

func ResultsEqual(r1, r2 []Result) bool

ResultsEqual compares two arrays of Result. reflect.DeepEqual shouldn't be used because of the protos.

func ResultsToProto3

func ResultsToProto3(qr []Result) []*querypb.QueryResult

ResultsToProto3 converts []Result to proto3.

func RowToProto3

func RowToProto3(row []Value) *querypb.Row

RowToProto3 converts []Value to proto3.

func RowsToProto3

func RowsToProto3(rows [][]Value) []*querypb.Row

RowsToProto3 converts [][]Value to proto3.

func SplitQueryResponsePartsEqual

func SplitQueryResponsePartsEqual(s1, s2 []*vtgatepb.SplitQueryResponse_Part) bool

SplitQueryResponsePartsEqual compares two arrays of SplitQueryResponse_Part.

func TypeToMySQL

func TypeToMySQL(typ querypb.Type) (mysqlType, flags int64)

TypeToMySQL returns the equivalent mysql type and flag for a vitess type.

Types

type BinWriter

type BinWriter interface {
	Write([]byte) (int, error)
	WriteByte(byte) error
}

BinWriter interface is used for encoding values. Types like bytes.Buffer conform to this interface. We expect the writer objects to be in-memory buffers. So, we don't expect the write operations to fail.

type QueryResponse

type QueryResponse struct {
	QueryResult *Result
	QueryError  error
}

QueryResponse represents a query response for ExecuteBatch.

func Proto3ToQueryReponses

func Proto3ToQueryReponses(qr []*querypb.ResultWithError) []QueryResponse

Proto3ToQueryReponses converts proto3 queryResponse to []QueryResponse.

type Result

type Result struct {
	Fields       []*querypb.Field      `json:"fields"`
	RowsAffected uint64                `json:"rows_affected"`
	InsertID     uint64                `json:"insert_id"`
	Rows         [][]Value             `json:"rows"`
	Extras       *querypb.ResultExtras `json:"extras"`
}

Result represents a query result.

func CustomProto3ToResult

func CustomProto3ToResult(fields []*querypb.Field, qr *querypb.QueryResult) *Result

CustomProto3ToResult converts a proto3 Result to an internal data structure. This function takes a separate fields input because not all QueryResults contain the field info. In particular, only the first packet of streaming queries contain the field info.

func Proto3ToResult

func Proto3ToResult(qr *querypb.QueryResult) *Result

Proto3ToResult converts a proto3 Result to an internal data structure. This function should be used only if the field info is populated in qr.

func Proto3ToResults

func Proto3ToResults(qr []*querypb.QueryResult) []Result

Proto3ToResults converts proto3 results to []Result.

func (*Result) AppendResult

func (result *Result) AppendResult(src *Result)

AppendResult will combine the Results Objects of one result to another result.Note currently it doesn't handle cases like if two results have different fields.We will enhance this function.

func (*Result) Copy

func (result *Result) Copy() *Result

Copy creates a deep copy of Result.

func (*Result) Equal

func (result *Result) Equal(other *Result) bool

Equal compares the Result with another one. reflect.DeepEqual shouldn't be used because of the protos.

func (*Result) Repair

func (result *Result) Repair(fields []*querypb.Field)

Repair fixes the type info in the rows to conform to the supplied field types.

func (*Result) StripMetadata

func (result *Result) StripMetadata(incl querypb.ExecuteOptions_IncludedFields) *Result

StripMetadata will return a new Result that has the same Rows, but the Field objects will have their non-critical metadata emptied. Note we don't proto.Copy each Field for performance reasons, but we only copy the individual fields.

type ResultStream

type ResultStream interface {
	// Recv returns the next result on the stream.
	// It will return io.EOF if the stream ended.
	Recv() (*Result, error)
}

ResultStream is an interface for receiving Result. It is used for RPC interfaces.

type Value

type Value struct {
	// contains filtered or unexported fields
}

Value can store any SQL value. If the value represents an integral type, the bytes are always stored as a cannonical representation that matches how MySQL returns such values.

func Add

func Add(v1, v2 Value, resultType querypb.Type) (Value, error)

Add adds two Values. A numeric value is first built from each input: Signed->int64, Unsigned->uint64, Float->float64. Otherwise the 'best type fit' is chosen for the number: int64 or float64. Addition is performed by upgrading types as needed, or in case of overflow: int64->uint64, int64->float64, uint64->float64. Unsigned ints can only be added to positive ints. After the addition, if one of the input types was Decimal, then a Decimal is built. Otherwise, the final type of the result is preserved. If any value is NULL, the result is NULL.

func BuildConverted

func BuildConverted(typ querypb.Type, goval interface{}) (v Value, err error)

BuildConverted is like BuildValue except that it tries to convert a string or []byte to an integral if the target type is an integral. We don't perform other implicit conversions because they're unsafe.

func BuildIntegral

func BuildIntegral(val string) (n Value, err error)

BuildIntegral builds an integral type from a string representaion. The type will be Int64 or Uint64. Int64 will be preferred where possible.

func BuildValue

func BuildValue(goval interface{}) (v Value, err error)

BuildValue builds a value from any go type. sqltype.Value is also allowed.

func MakeRowTrusted

func MakeRowTrusted(fields []*querypb.Field, row *querypb.Row) []Value

MakeRowTrusted converts a *querypb.Row to []Value based on the types in fields. It does not sanity check the values against the type. Every place this function is called, a comment is needed that explains why it's justified.

func MakeString

func MakeString(val []byte) Value

MakeString makes a VarBinary Value.

func MakeTrusted

func MakeTrusted(typ querypb.Type, val []byte) Value

MakeTrusted makes a new Value based on the type. If the value is an integral, then val must be in its cannonical form. This function should only be used if you know the value and type conform to the rules. Every place this function is called, a comment is needed that explains why it's justified. Functions within this package are exempt.

func ValueFromBytes

func ValueFromBytes(typ querypb.Type, val []byte) (v Value, err error)

ValueFromBytes builds a Value using typ and val. It ensures that val matches the requested type. If type is an integral it's converted to a cannonical form. Otherwise, the original representation is preserved.

func (Value) EncodeASCII

func (v Value) EncodeASCII(b BinWriter)

EncodeASCII encodes the value using 7-bit clean ascii bytes.

func (Value) EncodeSQL

func (v Value) EncodeSQL(b BinWriter)

EncodeSQL encodes the value into an SQL statement. Can be binary.

func (Value) IsBinary

func (v Value) IsBinary() bool

IsBinary returns true if Value is binary.

func (Value) IsFloat

func (v Value) IsFloat() bool

IsFloat returns true if Value is a float.

func (Value) IsIntegral

func (v Value) IsIntegral() bool

IsIntegral returns true if Value is an integral.

func (Value) IsNull

func (v Value) IsNull() bool

IsNull returns true if Value is null.

func (Value) IsQuoted

func (v Value) IsQuoted() bool

IsQuoted returns true if Value must be SQL-quoted.

func (Value) IsSigned

func (v Value) IsSigned() bool

IsSigned returns true if Value is a signed integral.

func (Value) IsText

func (v Value) IsText() bool

IsText returns true if Value is a collatable text.

func (Value) IsUnsigned

func (v Value) IsUnsigned() bool

IsUnsigned returns true if Value is an unsigned integral.

func (Value) Len

func (v Value) Len() int

Len returns the length.

func (Value) MarshalJSON

func (v Value) MarshalJSON() ([]byte, error)

MarshalJSON should only be used for testing. It's not a complete implementation.

func (Value) ParseFloat64

func (v Value) ParseFloat64() (val float64, err error)

ParseFloat64 will parse a Value into an float64. It does not check the type.

func (Value) ParseInt64

func (v Value) ParseInt64() (val int64, err error)

ParseInt64 will parse a Value into an int64. It does not check the type.

func (Value) ParseUint64

func (v Value) ParseUint64() (val uint64, err error)

ParseUint64 will parse a Value into a uint64. It does not check the type.

func (Value) Raw

func (v Value) Raw() []byte

Raw returns the raw bytes. All types are currently implemented as []byte. You should avoid using this function. If you do, you should treat the bytes as read-only.

func (Value) String

func (v Value) String() string

String returns the raw value as a string.

func (Value) ToNative

func (v Value) ToNative() interface{}

ToNative converts Value to a native go type. This does not work for sqltypes.Tuple. The function panics if there are inconsistencies.

func (Value) ToProtoValue

func (v Value) ToProtoValue() *querypb.Value

ToProtoValue converts Value to a querypb.Value.

func (Value) Type

func (v Value) Type() querypb.Type

Type returns the type of Value.

func (*Value) UnmarshalJSON

func (v *Value) UnmarshalJSON(b []byte) error

UnmarshalJSON should only be used for testing. It's not a complete implementation.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL