Documentation ¶
Overview ¶
Package sqltypes implements interfaces and types that represent SQL values.
Index ¶
- Constants
- Variables
- 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 Float64BindVariable(v float64) *querypb.BindVariable
- func Int32BindVariable(v int32) *querypb.BindVariable
- func Int64BindVariable(v int64) *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 MySQLToType(mysqlType, flags int64) (typ querypb.Type, err error)
- func ResolveRows(pvs []PlanValue, bindVars map[string]*querypb.BindVariable) ([][]Value, error)
- func StringBindVariable(v string) *querypb.BindVariable
- func TestBindVariable(v interface{}) *querypb.BindVariable
- 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 Value
- func BindVariableToValue(bv *querypb.BindVariable) (Value, error)
- func InterfaceToValue(goval interface{}) (Value, error)
- func MakeTrusted(typ querypb.Type, val []byte) Value
- func NewFloat64(v float64) Value
- func NewInt32(v int32) Value
- func NewInt64(v int64) Value
- func NewIntegral(val string) (n Value, err error)
- 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 ProtoToValue(v *querypb.Value) Value
- 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. 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 BindVariablesEqual ¶
func BindVariablesEqual(x, y map[string]*querypb.BindVariable) bool
BindVariablesEqual compares two maps of bind variables.
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 Float64BindVariable ¶
func Float64BindVariable(v float64) *querypb.BindVariable
Float64BindVariable converts a float64 to a bind var.
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 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 MySQLToType ¶
MySQLToType computes the vitess type from mysql type and flags.
func ResolveRows ¶
ResolveRows resolves a []PlanValue as rows based on the supplied bindvars.
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 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 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 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 NewIntegral ¶
NewIntegral builds an integral type from a string representaion. 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 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 represenation 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.