aboutsummaryrefslogtreecommitdiffstats
path: root/core/vm/sqlvm/ast
diff options
context:
space:
mode:
authorwmin0 <wmin0@cobinhood.com>2019-02-12 11:09:34 +0800
committerJhih-Ming Huang <jm.huang@cobinhood.com>2019-03-26 17:48:21 +0800
commit3292a673720e99d56495bc07ff0fc03f325c0737 (patch)
tree2f7c353203d216489ab6b6b0e665e6314427bf6f /core/vm/sqlvm/ast
parent457f0a5a26a4dc97c02d9d442ab7425d53a918a8 (diff)
downloaddexon-3292a673720e99d56495bc07ff0fc03f325c0737.tar
dexon-3292a673720e99d56495bc07ff0fc03f325c0737.tar.gz
dexon-3292a673720e99d56495bc07ff0fc03f325c0737.tar.bz2
dexon-3292a673720e99d56495bc07ff0fc03f325c0737.tar.lz
dexon-3292a673720e99d56495bc07ff0fc03f325c0737.tar.xz
dexon-3292a673720e99d56495bc07ff0fc03f325c0737.tar.zst
dexon-3292a673720e99d56495bc07ff0fc03f325c0737.zip
core: vm: sqlvm: add schema define and implement rlp serialization
Implement schema struct and handle its rlp serialization.
Diffstat (limited to 'core/vm/sqlvm/ast')
-rw-r--r--core/vm/sqlvm/ast/types.go28
-rw-r--r--core/vm/sqlvm/ast/types_test.go58
2 files changed, 44 insertions, 42 deletions
diff --git a/core/vm/sqlvm/ast/types.go b/core/vm/sqlvm/ast/types.go
index 80cda796c..48e7b1fb5 100644
--- a/core/vm/sqlvm/ast/types.go
+++ b/core/vm/sqlvm/ast/types.go
@@ -49,11 +49,13 @@ const (
// DataTypeUnknown for unknown data type.
const DataTypeUnknown DataType = 0
-func decomposeDataType(t DataType) (DataTypeMajor, DataTypeMinor) {
+// DecomposeDataType to major and minor part with given data type.
+func DecomposeDataType(t DataType) (DataTypeMajor, DataTypeMinor) {
return DataTypeMajor(t >> 8), DataTypeMinor(t & 0xff)
}
-func composeDataType(major DataTypeMajor, minor DataTypeMinor) DataType {
+// ComposeDataType to concrete type with major and minor part.
+func ComposeDataType(major DataTypeMajor, minor DataTypeMinor) DataType {
return (DataType(major) << 8) | DataType(minor)
}
@@ -78,10 +80,10 @@ func DataTypeEncode(n interface{}) (DataType, error) {
switch t := n.(type) {
case BoolTypeNode:
- return composeDataType(DataTypeMajorBool, 0), nil
+ return ComposeDataType(DataTypeMajorBool, 0), nil
case AddressTypeNode:
- return composeDataType(DataTypeMajorAddress, 0), nil
+ return ComposeDataType(DataTypeMajorAddress, 0), nil
case IntTypeNode:
if t.Size%8 != 0 || t.Size > 256 {
@@ -90,9 +92,9 @@ func DataTypeEncode(n interface{}) (DataType, error) {
minor := DataTypeMinor((t.Size / 8) - 1)
if t.Unsigned {
- return composeDataType(DataTypeMajorUint, minor), nil
+ return ComposeDataType(DataTypeMajorUint, minor), nil
}
- return composeDataType(DataTypeMajorInt, minor), nil
+ return ComposeDataType(DataTypeMajorInt, minor), nil
case FixedBytesTypeNode:
if t.Size%8 != 0 || t.Size > 256 {
@@ -100,10 +102,10 @@ func DataTypeEncode(n interface{}) (DataType, error) {
}
minor := DataTypeMinor((t.Size / 8) - 1)
- return composeDataType(DataTypeMajorFixedBytes, minor), nil
+ return ComposeDataType(DataTypeMajorFixedBytes, minor), nil
case DynamicBytesTypeNode:
- return composeDataType(DataTypeMajorDynamicBytes, 0), nil
+ return ComposeDataType(DataTypeMajorDynamicBytes, 0), nil
case FixedTypeNode:
if t.Size%8 != 0 || t.Size > 256 {
@@ -117,9 +119,9 @@ func DataTypeEncode(n interface{}) (DataType, error) {
major := DataTypeMajor((t.Size / 8) - 1)
minor := DataTypeMinor(t.FractionalDigits)
if t.Unsigned {
- return composeDataType(DataTypeMajorUfixed+major, minor), nil
+ return ComposeDataType(DataTypeMajorUfixed+major, minor), nil
}
- return composeDataType(DataTypeMajorFixed+major, minor), nil
+ return ComposeDataType(DataTypeMajorFixed+major, minor), nil
}
return DataTypeUnknown, ErrDataTypeEncode
@@ -127,7 +129,7 @@ func DataTypeEncode(n interface{}) (DataType, error) {
// DataTypeDecode decodes DataType into data type node.
func DataTypeDecode(t DataType) (interface{}, error) {
- major, minor := decomposeDataType(t)
+ major, minor := DecomposeDataType(t)
switch major {
// TODO(wmin0): define unsupported error for special type.
case DataTypeMajorBool:
@@ -229,7 +231,7 @@ func decimalDecode(signed bool, bs []byte) decimal.Decimal {
// DecimalEncode encodes decimal to bytes depend on data type.
func DecimalEncode(dt DataType, d decimal.Decimal) ([]byte, error) {
- major, minor := decomposeDataType(dt)
+ major, minor := DecomposeDataType(dt)
switch major {
case DataTypeMajorInt,
DataTypeMajorUint:
@@ -253,7 +255,7 @@ func DecimalEncode(dt DataType, d decimal.Decimal) ([]byte, error) {
// DecimalDecode decodes decimal from bytes.
func DecimalDecode(dt DataType, b []byte) (decimal.Decimal, error) {
- major, minor := decomposeDataType(dt)
+ major, minor := DecomposeDataType(dt)
switch major {
case DataTypeMajorInt:
return decimalDecode(true, b), nil
diff --git a/core/vm/sqlvm/ast/types_test.go b/core/vm/sqlvm/ast/types_test.go
index 31ed224fb..aa726c7ba 100644
--- a/core/vm/sqlvm/ast/types_test.go
+++ b/core/vm/sqlvm/ast/types_test.go
@@ -41,28 +41,28 @@ func (s *TypesTestSuite) requireDecodeError(input DataType) {
func (s *TypesTestSuite) TestEncodeAndDecode() {
s.requireEncodeAndDecodeNoError(
- composeDataType(DataTypeMajorBool, 0),
+ ComposeDataType(DataTypeMajorBool, 0),
BoolTypeNode{})
s.requireEncodeAndDecodeNoError(
- composeDataType(DataTypeMajorAddress, 0),
+ ComposeDataType(DataTypeMajorAddress, 0),
AddressTypeNode{})
s.requireEncodeAndDecodeNoError(
- composeDataType(DataTypeMajorInt, 1),
+ ComposeDataType(DataTypeMajorInt, 1),
IntTypeNode{Size: 16})
s.requireEncodeAndDecodeNoError(
- composeDataType(DataTypeMajorUint, 2),
+ ComposeDataType(DataTypeMajorUint, 2),
IntTypeNode{Unsigned: true, Size: 24})
s.requireEncodeAndDecodeNoError(
- composeDataType(DataTypeMajorFixedBytes, 3),
+ ComposeDataType(DataTypeMajorFixedBytes, 3),
FixedBytesTypeNode{Size: 32})
s.requireEncodeAndDecodeNoError(
- composeDataType(DataTypeMajorDynamicBytes, 0),
+ ComposeDataType(DataTypeMajorDynamicBytes, 0),
DynamicBytesTypeNode{})
s.requireEncodeAndDecodeNoError(
- composeDataType(DataTypeMajorFixed, 1),
+ ComposeDataType(DataTypeMajorFixed, 1),
FixedTypeNode{Size: 8, FractionalDigits: 1})
s.requireEncodeAndDecodeNoError(
- composeDataType(DataTypeMajorUfixed+1, 2),
+ ComposeDataType(DataTypeMajorUfixed+1, 2),
FixedTypeNode{Unsigned: true, Size: 16, FractionalDigits: 2})
}
@@ -79,15 +79,15 @@ func (s *TypesTestSuite) TestEncodeError() {
func (s *TypesTestSuite) TestDecodeError() {
s.requireDecodeError(DataTypeUnknown)
- s.requireDecodeError(composeDataType(DataTypeMajorBool, 1))
- s.requireDecodeError(composeDataType(DataTypeMajorAddress, 1))
- s.requireDecodeError(composeDataType(DataTypeMajorInt, 0x20))
- s.requireDecodeError(composeDataType(DataTypeMajorUint, 0x20))
- s.requireDecodeError(composeDataType(DataTypeMajorFixedBytes, 0x20))
- s.requireDecodeError(composeDataType(DataTypeMajorDynamicBytes, 1))
- s.requireDecodeError(composeDataType(DataTypeMajorFixed, 81))
- s.requireDecodeError(composeDataType(DataTypeMajorUfixed, 81))
- s.requireDecodeError(composeDataType(DataTypeMajorUfixed+0x20, 80))
+ s.requireDecodeError(ComposeDataType(DataTypeMajorBool, 1))
+ s.requireDecodeError(ComposeDataType(DataTypeMajorAddress, 1))
+ s.requireDecodeError(ComposeDataType(DataTypeMajorInt, 0x20))
+ s.requireDecodeError(ComposeDataType(DataTypeMajorUint, 0x20))
+ s.requireDecodeError(ComposeDataType(DataTypeMajorFixedBytes, 0x20))
+ s.requireDecodeError(ComposeDataType(DataTypeMajorDynamicBytes, 1))
+ s.requireDecodeError(ComposeDataType(DataTypeMajorFixed, 81))
+ s.requireDecodeError(ComposeDataType(DataTypeMajorUfixed, 81))
+ s.requireDecodeError(ComposeDataType(DataTypeMajorUfixed+0x20, 80))
}
func (s *TypesTestSuite) TestEncodeAndDecodeDecimal() {
@@ -96,33 +96,33 @@ func (s *TypesTestSuite) TestEncodeAndDecodeDecimal() {
neg := decimal.New(-15, 0)
s.requireEncodeAndDecodeDecimalNoError(
- composeDataType(DataTypeMajorInt, 2),
+ ComposeDataType(DataTypeMajorInt, 2),
pos,
3)
s.requireEncodeAndDecodeDecimalNoError(
- composeDataType(DataTypeMajorInt, 2),
+ ComposeDataType(DataTypeMajorInt, 2),
zero,
3)
s.requireEncodeAndDecodeDecimalNoError(
- composeDataType(DataTypeMajorInt, 2),
+ ComposeDataType(DataTypeMajorInt, 2),
neg,
3)
s.requireEncodeAndDecodeDecimalNoError(
- composeDataType(DataTypeMajorUint, 2),
+ ComposeDataType(DataTypeMajorUint, 2),
pos,
3)
s.requireEncodeAndDecodeDecimalNoError(
- composeDataType(DataTypeMajorUint, 2),
+ ComposeDataType(DataTypeMajorUint, 2),
zero,
3)
s.requireEncodeAndDecodeDecimalNoError(
- composeDataType(DataTypeMajorAddress, 0),
+ ComposeDataType(DataTypeMajorAddress, 0),
pos,
20)
s.requireEncodeAndDecodeDecimalNoError(
- composeDataType(DataTypeMajorAddress, 0),
+ ComposeDataType(DataTypeMajorAddress, 0),
zero,
20)
@@ -130,24 +130,24 @@ func (s *TypesTestSuite) TestEncodeAndDecodeDecimal() {
neg = decimal.New(-15, -2)
s.requireEncodeAndDecodeDecimalNoError(
- composeDataType(DataTypeMajorFixed+2, 2),
+ ComposeDataType(DataTypeMajorFixed+2, 2),
pos,
3)
s.requireEncodeAndDecodeDecimalNoError(
- composeDataType(DataTypeMajorFixed+2, 2),
+ ComposeDataType(DataTypeMajorFixed+2, 2),
zero,
3)
s.requireEncodeAndDecodeDecimalNoError(
- composeDataType(DataTypeMajorFixed+2, 2),
+ ComposeDataType(DataTypeMajorFixed+2, 2),
neg,
3)
s.requireEncodeAndDecodeDecimalNoError(
- composeDataType(DataTypeMajorUfixed+2, 2),
+ ComposeDataType(DataTypeMajorUfixed+2, 2),
pos,
3)
s.requireEncodeAndDecodeDecimalNoError(
- composeDataType(DataTypeMajorUfixed+2, 2),
+ ComposeDataType(DataTypeMajorUfixed+2, 2),
zero,
3)
}