diff options
Diffstat (limited to 'core/vm/sqlvm/ast/types.go')
-rw-r--r-- | core/vm/sqlvm/ast/types.go | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/core/vm/sqlvm/ast/types.go b/core/vm/sqlvm/ast/types.go index 9d7efc430..ee8036576 100644 --- a/core/vm/sqlvm/ast/types.go +++ b/core/vm/sqlvm/ast/types.go @@ -1,6 +1,7 @@ package ast import ( + "database/sql" "fmt" "math" "math/big" @@ -17,6 +18,16 @@ var ( bigIntTen = big.NewInt(10) ) +// BoolValue represents a boolean value used by SQL three-valued logic. +type BoolValue uint8 + +// Define valid values for SQL boolean type. The zero value is invalid. +const ( + BoolValueTrue BoolValue = 1 + BoolValueFalse BoolValue = 2 + BoolValueUnknown BoolValue = 3 +) + // DataTypeMajor defines type for high byte of DataType. type DataTypeMajor uint8 @@ -54,6 +65,90 @@ const ( DataTypeBad DataType = math.MaxUint16 ) +// Valid returns whether a BoolValue is valid. +func (v BoolValue) Valid() bool { + return v-1 < 3 +} + +var boolValueStringMap = [3]string{ + BoolValueTrue - 1: "TRUE", + BoolValueFalse - 1: "FALSE", + BoolValueUnknown - 1: "UNKNOWN", +} + +// String returns a string for printing a BoolValue. +func (v BoolValue) String() string { + return boolValueStringMap[v-1] +} + +var boolValueNullBoolMap = [3]sql.NullBool{ + BoolValueTrue - 1: {Valid: true, Bool: true}, + BoolValueFalse - 1: {Valid: true, Bool: false}, + BoolValueUnknown - 1: {Valid: false, Bool: false}, +} + +// NullBool converts a BoolValue to a sql.NullBool. +func (v BoolValue) NullBool() sql.NullBool { + return boolValueNullBoolMap[v-1] +} + +var boolValueAndTruthTable = [3][3]BoolValue{ + BoolValueTrue - 1: { + BoolValueTrue - 1: BoolValueTrue, + BoolValueFalse - 1: BoolValueFalse, + BoolValueUnknown - 1: BoolValueUnknown, + }, + BoolValueFalse - 1: { + BoolValueTrue - 1: BoolValueFalse, + BoolValueFalse - 1: BoolValueFalse, + BoolValueUnknown - 1: BoolValueFalse, + }, + BoolValueUnknown - 1: { + BoolValueTrue - 1: BoolValueUnknown, + BoolValueFalse - 1: BoolValueFalse, + BoolValueUnknown - 1: BoolValueUnknown, + }, +} + +// And returns v AND v2. +func (v BoolValue) And(v2 BoolValue) BoolValue { + return boolValueAndTruthTable[v-1][v2-1] +} + +var boolValueOrTruthTable = [3][3]BoolValue{ + BoolValueTrue - 1: { + BoolValueTrue - 1: BoolValueTrue, + BoolValueFalse - 1: BoolValueTrue, + BoolValueUnknown - 1: BoolValueTrue, + }, + BoolValueFalse - 1: { + BoolValueTrue - 1: BoolValueTrue, + BoolValueFalse - 1: BoolValueFalse, + BoolValueUnknown - 1: BoolValueUnknown, + }, + BoolValueUnknown - 1: { + BoolValueTrue - 1: BoolValueTrue, + BoolValueFalse - 1: BoolValueUnknown, + BoolValueUnknown - 1: BoolValueUnknown, + }, +} + +// Or returns v OR v2. +func (v BoolValue) Or(v2 BoolValue) BoolValue { + return boolValueOrTruthTable[v-1][v2-1] +} + +var boolValueNotTruthTable = [3]BoolValue{ + BoolValueTrue - 1: BoolValueFalse, + BoolValueFalse - 1: BoolValueTrue, + BoolValueUnknown - 1: BoolValueUnknown, +} + +// Not returns NOT v. +func (v BoolValue) Not() BoolValue { + return boolValueNotTruthTable[v-1] +} + // DecomposeDataType to major and minor part with given data type. func DecomposeDataType(t DataType) (DataTypeMajor, DataTypeMinor) { return DataTypeMajor(t >> 8), DataTypeMinor(t & 0xff) |