Documentation ¶
Overview ¶
Package sqltypes implements interfaces and types that represent SQL values.
Index ¶
- Constants
- Variables
- func AreTypesEquivalent(mysqlTypeFromBinlog, mysqlTypeFromSchema querypb.Type) bool
- func BindVariablesEqual(x, y map[string]*querypb.BindVariable) bool
- func BuildBindVariable(v interface{}) (*querypb.BindVariable, error)
- func BuildBindVariables(in map[string]interface{}) (map[string]*querypb.BindVariable, error)
- func BytesBindVariable(v []byte) *querypb.BindVariable
- func CopyBindVariables(bindVariables map[string]*querypb.BindVariable) map[string]*querypb.BindVariable
- func EventTokenMinimum(ev1, ev2 *querypb.EventToken) *querypb.EventToken
- func FieldsEqual(f1, f2 []*querypb.Field) bool
- func Float64BindVariable(v float64) *querypb.BindVariable
- func FormatBindVariables(bindVariables map[string]*querypb.BindVariable, full, asJSON bool) string
- func IncludeFieldsOrDefault(options *querypb.ExecuteOptions) querypb.ExecuteOptions_IncludedFields
- func Int32BindVariable(v int32) *querypb.BindVariable
- func Int64BindVariable(v int64) *querypb.BindVariable
- func Int8BindVariable(v int8) *querypb.BindVariable
- func IsBinary(t querypb.Type) bool
- func IsFloat(t querypb.Type) bool
- func IsIntegral(t querypb.Type) bool
- func IsQuoted(t querypb.Type) bool
- func IsSigned(t querypb.Type) bool
- func IsText(t querypb.Type) bool
- func IsUnsigned(t querypb.Type) bool
- func MakeTestFields(names, types string) []*querypb.Field
- func MySQLToType(mysqlType, flags int64) (typ querypb.Type, err error)
- func NullsafeCompare(v1, v2 Value) (int, error)
- func PrintResults(results []*Result) string
- func Proto3QueryResponsesEqual(r1, r2 []*querypb.ResultWithError) bool
- func Proto3ResultsEqual(r1, r2 []*querypb.QueryResult) bool
- func Proto3ValuesEqual(v1, v2 []*querypb.Value) bool
- func QueryResponsesEqual(r1, r2 []QueryResponse) bool
- func QueryResponsesToProto3(qr []QueryResponse) []*querypb.ResultWithError
- func ResolveRows(pvs []PlanValue, bindVars map[string]*querypb.BindVariable) ([][]Value, error)
- func ResultToProto3(qr *Result) *querypb.QueryResult
- func ResultsEqual(r1, r2 []Result) bool
- func ResultsToProto3(qr []Result) []*querypb.QueryResult
- func RowToProto3(row []Value) *querypb.Row
- func RowsToProto3(rows [][]Value) []*querypb.Row
- func SplitQueryResponsePartsEqual(s1, s2 []*vtgatepb.SplitQueryResponse_Part) bool
- func StringBindVariable(v string) *querypb.BindVariable
- func TestBindVariable(v interface{}) *querypb.BindVariable
- func ToFloat64(v Value) (float64, error)
- func ToInt64(v Value) (int64, error)
- func ToNative(v Value) (interface{}, error)
- func ToUint64(v Value) (uint64, error)
- func TypeToMySQL(typ querypb.Type) (mysqlType, flags int64)
- func Uint64BindVariable(v uint64) *querypb.BindVariable
- func ValidateBindVariable(bv *querypb.BindVariable) error
- func ValidateBindVariables(bv map[string]*querypb.BindVariable) error
- func ValueBindVariable(v Value) *querypb.BindVariable
- func ValueToProto(v Value) *querypb.Value
- type BinWriter
- type PlanValue
- func (pv PlanValue) IsList() bool
- func (pv PlanValue) IsNull() bool
- func (pv PlanValue) MarshalJSON() ([]byte, error)
- func (pv PlanValue) ResolveList(bindVars map[string]*querypb.BindVariable) ([]Value, error)
- func (pv PlanValue) ResolveValue(bindVars map[string]*querypb.BindVariable) (Value, error)
- type QueryResponse
- type Result
- func CustomProto3ToResult(fields []*querypb.Field, qr *querypb.QueryResult) *Result
- func MakeTestResult(fields []*querypb.Field, rows ...string) *Result
- func MakeTestStreamingResults(fields []*querypb.Field, rows ...string) []*Result
- func Proto3ToResult(qr *querypb.QueryResult) *Result
- func Proto3ToResults(qr []*querypb.QueryResult) []Result
- func (result *Result) AppendResult(src *Result)
- func (result *Result) Copy() *Result
- func (result *Result) Equal(other *Result) bool
- func (result *Result) Repair(fields []*querypb.Field)
- func (result *Result) StripMetadata(incl querypb.ExecuteOptions_IncludedFields) *Result
- func (result *Result) Truncate(l int) *Result
- type ResultStream
- type Value
- func Add(v1, v2 Value) (Value, error)
- func BindVariableToValue(bv *querypb.BindVariable) (Value, error)
- func Cast(v Value, typ querypb.Type) (Value, error)
- func CopyRow(r []Value) []Value
- func Divide(v1, v2 Value) (Value, error)
- func InterfaceToValue(goval interface{}) (Value, error)
- func MakeRowTrusted(fields []*querypb.Field, row *querypb.Row) []Value
- func MakeTrusted(typ querypb.Type, val []byte) Value
- func Max(v1, v2 Value) (Value, error)
- func Min(v1, v2 Value) (Value, error)
- func Multiply(v1, v2 Value) (Value, error)
- func NewFloat64(v float64) Value
- func NewInt32(v int32) Value
- func NewInt64(v int64) Value
- func NewInt8(v int8) Value
- func NewIntegral(val string) (n Value, err error)
- func NewUint32(v uint32) Value
- func NewUint64(v uint64) Value
- func NewValue(typ querypb.Type, val []byte) (v Value, err error)
- func NewVarBinary(v string) Value
- func NewVarChar(v string) Value
- func NullsafeAdd(v1, v2 Value, resultType querypb.Type) Value
- func ProtoToValue(v *querypb.Value) Value
- func Subtract(v1, v2 Value) (Value, error)
- func TestValue(typ querypb.Type, val string) Value
- func (v Value) EncodeASCII(b BinWriter)
- func (v Value) EncodeSQL(b BinWriter)
- func (v Value) IsBinary() bool
- func (v Value) IsFloat() bool
- func (v Value) IsIntegral() bool
- func (v Value) IsNull() bool
- func (v Value) IsQuoted() bool
- func (v Value) IsSigned() bool
- func (v Value) IsText() bool
- func (v Value) IsUnsigned() bool
- func (v Value) Len() int
- func (v Value) MarshalJSON() ([]byte, error)
- func (v Value) Raw() []byte
- func (v Value) String() string
- func (v Value) ToBytes() []byte
- func (v Value) ToString() string
- func (v Value) Type() querypb.Type
- func (v *Value) UnmarshalJSON(b []byte) error
Constants ¶
const ( Null = querypb.Type_NULL_TYPE Int8 = querypb.Type_INT8 Uint8 = querypb.Type_UINT8 Int16 = querypb.Type_INT16 Uint16 = querypb.Type_UINT16 Int24 = querypb.Type_INT24 Uint24 = querypb.Type_UINT24 Int32 = querypb.Type_INT32 Uint32 = querypb.Type_UINT32 Int64 = querypb.Type_INT64 Uint64 = querypb.Type_UINT64 Float32 = querypb.Type_FLOAT32 Float64 = querypb.Type_FLOAT64 Timestamp = querypb.Type_TIMESTAMP Date = querypb.Type_DATE Time = querypb.Type_TIME Datetime = querypb.Type_DATETIME Year = querypb.Type_YEAR Decimal = querypb.Type_DECIMAL Text = querypb.Type_TEXT Blob = querypb.Type_BLOB VarChar = querypb.Type_VARCHAR VarBinary = querypb.Type_VARBINARY Char = querypb.Type_CHAR Binary = querypb.Type_BINARY Bit = querypb.Type_BIT Enum = querypb.Type_ENUM Set = querypb.Type_SET Geometry = querypb.Type_GEOMETRY TypeJSON = querypb.Type_JSON Expression = querypb.Type_EXPRESSION )
Vitess data types. These are idiomatically named synonyms for the querypb.Type values. Although these constants are interchangeable, they should be treated as different from querypb.Type. Use the synonyms only to refer to the type in Value. For proto variables, use the querypb.Type constants instead. The following conditions are non-overlapping and cover all types: IsSigned(), IsUnsigned(), IsFloat(), IsQuoted(), Null, Decimal, Expression, Bit Also, IsIntegral() == (IsSigned()||IsUnsigned()). TestCategory needs to be updated accordingly if you add a new type. If IsBinary or IsText is true, then IsQuoted is also true. But there are IsQuoted types that are neither binary or text. querypb.Type_TUPLE is not included in this list because it's not a valid Value type. TODO(sougou): provide a categorization function that returns enums, which will allow for cleaner switch statements for those who want to cover types by their category.
Variables ¶
var ( // NULL represents the NULL value. NULL = Value{} // DontEscape tells you if a character should not be escaped. DontEscape = byte(255) )
var NullBindVariable = &querypb.BindVariable{Type: querypb.Type_NULL_TYPE}
NullBindVariable is a bindvar with NULL value.
var SQLDecodeMap [256]byte
SQLDecodeMap is the reverse of SQLEncodeMap
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 AreTypesEquivalent ¶
TypeEquivalenceCheck returns whether two types are equivalent.
func BindVariablesEqual ¶
func BindVariablesEqual(x, y map[string]*querypb.BindVariable) bool
BindVariablesEqual compares two maps of bind variables. For protobuf messages we have to use "proto.Equal".
func BuildBindVariable ¶
func BuildBindVariable(v interface{}) (*querypb.BindVariable, error)
BuildBindVariable builds a *querypb.BindVariable from a valid input type.
func BuildBindVariables ¶
func BuildBindVariables(in map[string]interface{}) (map[string]*querypb.BindVariable, error)
BuildBindVariables builds a map[string]*querypb.BindVariable from a map[string]interface{}.
func BytesBindVariable ¶
func BytesBindVariable(v []byte) *querypb.BindVariable
BytesBindVariable converts a []byte to a bind var.
func CopyBindVariables ¶
func CopyBindVariables(bindVariables map[string]*querypb.BindVariable) map[string]*querypb.BindVariable
CopyBindVariables returns a shallow-copy of the given bindVariables map.
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 ¶
FieldsEqual compares two arrays of fields. reflect.DeepEqual shouldn't be used because of the protos.
func Float64BindVariable ¶
func Float64BindVariable(v float64) *querypb.BindVariable
Float64BindVariable converts a float64 to a bind var.
func FormatBindVariables ¶
func FormatBindVariables(bindVariables map[string]*querypb.BindVariable, full, asJSON bool) string
FormatBindVariables returns a string representation of the bind variables.
If full is false, then large string or tuple values are truncated to only print the lengths.
If asJson is true, then the resulting string is a valid JSON representation, otherwise it is the golang printed map representation.
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 Int32BindVariable ¶
func Int32BindVariable(v int32) *querypb.BindVariable
Int32BindVariable converts an int32 to a bind var.
func Int64BindVariable ¶
func Int64BindVariable(v int64) *querypb.BindVariable
Int64BindVariable converts an int64 to a bind var.
func Int8BindVariable ¶
func Int8BindVariable(v int8) *querypb.BindVariable
Int8BindVariable converts an int8 to a bind var.
func IsBinary ¶
IsBinary returns true if querypb.Type is a binary. If you have a Value object, use its member function.
func IsFloat ¶
IsFloat returns true is querypb.Type is a floating point. If you have a Value object, use its member function.
func IsIntegral ¶
IsIntegral returns true if querypb.Type is an integral (signed/unsigned) that can be represented using up to 64 binary bits. If you have a Value object, use its member function.
func IsQuoted ¶
IsQuoted returns true if querypb.Type is a quoted text or binary. If you have a Value object, use its member function.
func IsSigned ¶
IsSigned returns true if querypb.Type is a signed integral. If you have a Value object, use its member function.
func IsText ¶
IsText returns true if querypb.Type is a text. If you have a Value object, use its member function.
func IsUnsigned ¶
IsUnsigned returns true if querypb.Type is an unsigned integral. Caution: this is not the same as !IsSigned. If you have a Value object, use its member function.
func MakeTestFields ¶
MakeTestFields builds a []*querypb.Field for testing.
fields := sqltypes.MakeTestFields( "a|b", "int64|varchar", )
The field types are as defined in querypb and are case insensitive. Column delimiters must be used only to sepearate strings and not at the beginning or the end.
func MySQLToType ¶
MySQLToType computes the vitess type from mysql type and flags.
func NullsafeCompare ¶
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. Uncomparable values return an error.
func PrintResults ¶
PrintResults prints []*Results into a string. This function should only be used for testing.
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 ¶
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 ResolveRows ¶
ResolveRows resolves a []PlanValue as rows based on the supplied bindvars.
func ResultToProto3 ¶
func ResultToProto3(qr *Result) *querypb.QueryResult
ResultToProto3 converts Result to proto3.
func ResultsEqual ¶
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 ¶
RowToProto3 converts []Value to proto3.
func RowsToProto3 ¶
RowsToProto3 converts [][]Value to proto3.
func SplitQueryResponsePartsEqual ¶
func SplitQueryResponsePartsEqual(s1, s2 []*vtgatepb.SplitQueryResponse_Part) bool
SplitQueryResponsePartsEqual compares two arrays of SplitQueryResponse_Part.
func StringBindVariable ¶
func StringBindVariable(v string) *querypb.BindVariable
StringBindVariable converts a string to a bind var.
func TestBindVariable ¶
func TestBindVariable(v interface{}) *querypb.BindVariable
TestBindVariable makes a *querypb.BindVariable from an interface{}.It panics on invalid input. This function should only be used for testing.
func TypeToMySQL ¶
TypeToMySQL returns the equivalent mysql type and flag for a vitess type.
func Uint64BindVariable ¶
func Uint64BindVariable(v uint64) *querypb.BindVariable
Uint64BindVariable converts a uint64 to a bind var.
func ValidateBindVariable ¶
func ValidateBindVariable(bv *querypb.BindVariable) error
ValidateBindVariable returns an error if the bind variable has inconsistent fields.
func ValidateBindVariables ¶
func ValidateBindVariables(bv map[string]*querypb.BindVariable) error
ValidateBindVariables validates a map[string]*querypb.BindVariable.
func ValueBindVariable ¶
func ValueBindVariable(v Value) *querypb.BindVariable
ValueBindVariable converts a Value to a bind var.
func ValueToProto ¶
ValueToProto converts Value to a *querypb.Value.
Types ¶
type BinWriter ¶
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 PlanValue ¶
PlanValue represents a value or a list of values for a column that will later be resolved using bind vars and used to perform plan actions like generating the final query or deciding on a route.
Plan values are typically used as a slice ([]planValue) where each entry is for one column. For situations where the required output is a list of rows (like in the case of multi-value inserts), the representation is pivoted. For example, a statement like this:
INSERT INTO t VALUES (1, 2), (3, 4)
will be represented as follows:
[]PlanValue{ Values: {1, 3}, Values: {2, 4}, }
For WHERE clause items that contain a combination of equality expressions and IN clauses like this:
WHERE pk1 = 1 AND pk2 IN (2, 3, 4)
The plan values will be represented as follows:
[]PlanValue{ Value: 1, Values: {2, 3, 4}, }
When converted into rows, columns with single values are replicated as the same for all rows:
[][]Value{ {1, 2}, {1, 3}, {1, 4}, }
func (PlanValue) MarshalJSON ¶
MarshalJSON should be used only for testing.
func (PlanValue) ResolveList ¶
ResolveList resolves a PlanValue as a list of values based on the supplied bindvars.
func (PlanValue) ResolveValue ¶
ResolveValue resolves a PlanValue as a single value based on the supplied bindvars.
type QueryResponse ¶
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"` Info string `json:"info"` 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 MakeTestResult ¶
MakeTestResult builds a *sqltypes.Result object for testing.
result := sqltypes.MakeTestResult( fields, " 1|a", "10|abcd", )
The field type values are set as the types for the rows built. Spaces are trimmed from row values. "null" is treated as NULL.
func MakeTestStreamingResults ¶
MakeTestStreamingResults builds a list of results for streaming.
results := sqltypes.MakeStreamingResults( fields, "1|a", "2|b", "---", "c|c", )
The first result contains only the fields. Subsequent results are built using the field types. Every input that starts with a "-" is treated as streaming delimiter for one result. A final delimiter must not be supplied.
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 ¶
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) Equal ¶
Equal compares the Result with another one. reflect.DeepEqual shouldn't be used because of the protos.
func (*Result) Repair ¶
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 canonical representation that matches how MySQL returns such values.
func BindVariableToValue ¶
func BindVariableToValue(bv *querypb.BindVariable) (Value, error)
BindVariableToValue converts a bind var into a Value.
func InterfaceToValue ¶
InterfaceToValue builds a value from a go type. Supported types are nil, int64, uint64, float64, string and []byte. This function is deprecated. Use the type-specific functions instead.
func MakeRowTrusted ¶
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 MakeTrusted ¶
MakeTrusted makes a new Value based on the type. 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. Exceptions: The current package and mysql package do not need comments. Other packages can also use the function to create VarBinary or VarChar values.
func Max ¶
Max returns the maximum of v1 and v2. If one of the values is NULL, it returns the other value. If both are NULL, it returns NULL.
func Min ¶
Min returns the minimum of v1 and v2. If one of the values is NULL, it returns the other value. If both are NULL, it returns NULL.
func NewIntegral ¶
NewIntegral builds an integral type from a string representation. The type will be Int64 or Uint64. Int64 will be preferred where possible.
func NewValue ¶
NewValue builds a Value using typ and val. If the value and typ don't match, it returns an error.
func NewVarBinary ¶
NewVarBinary builds a VarBinary Value. The input is a string because it's the most common use case.
func NullsafeAdd ¶
NullsafeAdd adds two Values in a null-safe manner. A null value is treated as 0. If both values are null, then a null is returned. If both values are not null, a numeric value is 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.
func ProtoToValue ¶
ProtoToValue converts a *querypb.Value to a Value.
func TestValue ¶
TestValue builds a Value from typ and val. This function should only be used for testing.
func (Value) EncodeASCII ¶
EncodeASCII encodes the value using 7-bit clean ascii bytes.
func (Value) IsIntegral ¶
IsIntegral returns true if Value is an integral.
func (Value) IsUnsigned ¶
IsUnsigned returns true if Value is an unsigned integral.
func (Value) MarshalJSON ¶
MarshalJSON should only be used for testing. It's not a complete implementation.
func (Value) Raw ¶
Raw returns the internal representation of the value. For newer types, this may not match MySQL's representation.
func (Value) ToBytes ¶
ToBytes returns the value as MySQL would return it as []byte. In contrast, Raw returns the internal representation of the Value, which may not match MySQL's representation for newer types. If the value is not convertible like in the case of Expression, it returns nil.
func (Value) ToString ¶
ToString returns the value as MySQL would return it as string. If the value is not convertible like in the case of Expression, it returns nil.
func (*Value) UnmarshalJSON ¶
UnmarshalJSON should only be used for testing. It's not a complete implementation.