aboutsummaryrefslogtreecommitdiffstats
path: root/core/vm/sqlvm/ast/types.go
diff options
context:
space:
mode:
Diffstat (limited to 'core/vm/sqlvm/ast/types.go')
-rw-r--r--core/vm/sqlvm/ast/types.go95
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)