aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJhih-Ming Huang <jm.huang@cobinhood.com>2019-04-01 17:19:22 +0800
committerJhih-Ming Huang <jm.huang@cobinhood.com>2019-05-06 10:44:04 +0800
commit4c3bc281c9d8409e2ae030be63e82d2c27aa73aa (patch)
tree2c37c5efb80537e89d1e2346ab05da6fb9bd4275
parent90295637bc9e7fe47d3001266efcf53252fe699a (diff)
downloaddexon-4c3bc281c9d8409e2ae030be63e82d2c27aa73aa.tar.gz
dexon-4c3bc281c9d8409e2ae030be63e82d2c27aa73aa.tar.zst
dexon-4c3bc281c9d8409e2ae030be63e82d2c27aa73aa.zip
core: vm: sqlvm: update op code
* Remove STOREPK. * Split STORE to UPDATE and INSERT. * Remove the examples.
-rw-r--r--core/vm/sqlvm/runtime/opcodes.go89
1 files changed, 2 insertions, 87 deletions
diff --git a/core/vm/sqlvm/runtime/opcodes.go b/core/vm/sqlvm/runtime/opcodes.go
index 22628b28e..5803c6982 100644
--- a/core/vm/sqlvm/runtime/opcodes.go
+++ b/core/vm/sqlvm/runtime/opcodes.go
@@ -6,130 +6,45 @@ type OpCode byte
// 0x10 range - arithmetic ops. (array-based)
const (
ADD OpCode = iota + 0x10
- // ADD(t1, t2) res
- // res = t1 + t2 = [1, 2] + [2, 3] = [3, 5]
MUL
- // MUL(t1, t2) res
- // res = t1 * t2 = [1, 2] * [2, 3] = [2, 6]
SUB
- // SUB(t1, t2) res
- // res = t1 - t2 = [1, 2] - [2, 3] = [-1, -1]
DIV
- // DIV(t1, t2) res
- // res = t1 / t2 = [1, 2] / [2, 3] = [0, 0]
MOD
- // MOD(t1, t2) res
- // res = t1 % t2 = [1, 2] % [2, 3] = [1, 2]
-
)
// 0x20 range - comparison ops.
const (
LT OpCode = iota + 0x20
- // LT(t1, t2) res
- // res = t1 < t2 = [1, 2] < [2, 3] = [true, true]
GT
- // GT(t1, t2) res
- // res = t1 > t2 = [1, 2] > [2, 3] = [false, false]
EQ
- // EQ(t1, t2) res
- // res = t1 == t2 = [1, 2] == [2, 3] = [false, false]
AND
- // AND(t1, t2) res
- // res = t1 && t2 = [true, true] && [true, false] = [true, false]
OR
- // OR(t1, t2) res
- // res = t1 || t2 = [false, false] || [true, false] = [true, false]
NOT
- // NOT(t1) res
- // res = !t1 = ![false, true] = [true, false]
UNION
- // UNION(t1, t2) res
- // res = t1 ∪ t2 = [1, 2] ∪ [2, 3] = [1, 2, 3]
INTXN
- // INTXN(t1, t2) res
- // res = t1 ∩ t2 = [1, 2] ∩ [2, 3] = [2]
LIKE
- // LIKE(t1, pattern) res
- // res = t1 like '%abc%' =
- // ['_abc_', '123'] like '%abc%' = [true, false]
)
// 0x30 range - pk/index/field meta ops
const (
REPEATPK OpCode = iota + 0x30
- // REPEATPK(pk) res res = [id1, id2, id3, ...]
- // REPEATPK([tables, table_id, primary]) = [1, 2, 3, 5, 6, 7, ...]
REPEATIDX
- // Scan given index value(s)
- // REPEATIDX(base, idxv) res res = [id2, id4, id5, id6]
- // REPEATIDX(
- // [tables, table_id, indices, name_idx],
- // [val1, val3]
- // ) = [5, 6, 7, 10, 11, ... ]
REPEATIDXV
- // Get possible values from index value meta
- // REPEATIDXV(idx) res res = [val1, val2, val3, ...]
- // REPEATIDXV(
- // [tables, table_id, indices, name_idx]
- // ) = ["alice", "bob", "foo", "bar", ... ]
)
// 0x40 range - format/output ops
const (
ZIP OpCode = iota + 0x40
- // ZIP(tgr, new) = res
- // ZIP([f1, f2, f3], [c1, c2, c3]) = [(f1, c1), (f2, c2), (f3, c3)]
- // ZIP(
- // [(f1, c1), (f2, c2), (f3, c3)],
- // [(x1, (y1)), (x2, (y2)), (x3, (y3))]
- // ) = [(f1, c1, x1, (y1)), (f2, c2, x2, (y2)), (f3, c3, x2, (y2))]
FIELD
- // (src, fields) = res
- // (
- // [(r1f1, r1f2, r1f3), (r2f1, r2f2, r2f3),...], [2,3]
- // ) = [(r1f2, r1f3), (r2f2, r2f3), ...]
SORT
- // SORT(src, [(field, order, null order)] ) = res
- // SORT(
- // [(a1, a2, a3), (b1, a2, null), (a1, b2, null), ...],
- // [(1, asc, null_first), (2, desc, null_last), (3, asc, null_last)]
- // ) = [(a1, a2, a3), (a1, b2, null), (b1, a2, null), ...]
FILTER
- // FILTER(src, cond) = res
- // FILTER([1, 2, 3, 4, 5], [true, false, true, false, false]) = [1, 3]
CAST
- // CAST(t1, types) t2
)
// 0x60 range - storage ops
const (
- STOREPK OpCode = iota + 0x60
- // STOREPK(pk, [uint256, uint256, ...])
- LOADPK
- // LOADPK(pk) array array = [uint256, uint256, ...]
- STORE
- // STORE(base, ids, values, fields, idxes)
- // STORE(
- // [tables, table_id, primary],
- // [],
- // [field1, field2, [field3.1, field3.2]],
- // []
- // )
- // STORE(
- // [tables, table_id, primary],
- // [1, 2],
- // [updated_field1, updated_field2],
- // [1, 2]
- // )
+ INSERT = iota + 0x60
+ UPDATE
LOAD
- // LOAD(base, ids, fields) array
- // LOAD(
- // [tables, table_id, primary], [1], []
- // ) = [(field1, field2, [field3.1, field3.2])]
- // LOAD(
- // [tables, table_id, primary, [1], [1,3]
- // ) =[(field1, [field3.1, field3.2])]
DELETE
- // DELETE(base, ids, idxes)
)