/
plan.go
102 lines (87 loc) · 2.73 KB
/
plan.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// Copyright 2022 Matrix Origin
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package plan
import "bytes"
const (
SystemExternalRel = "e"
)
// when autocommit is set to false, and no active txn is started
// an implicit txn need to be started for statements , like insert/delete/update
// and most select statement, like select * from t1.
// but for statement like select 1 or SELECT @@session.autocommit , implicit txn is not needed
// walk through the plan for select statement and check if there is an node_table_scan
func (p *Plan) NeedImplicitTxn() bool {
if p.GetQuery().GetStmtType() != Query_SELECT {
return true
}
for _, n := range p.GetQuery().GetNodes() {
if n.GetNodeType() == Node_TABLE_SCAN {
return true
}
}
return false
}
func (p *Plan) MarshalBinary() ([]byte, error) {
data := make([]byte, p.ProtoSize())
_, err := p.MarshalTo(data)
return data, err
}
func (p *Plan) UnmarshalBinary(data []byte) error {
return p.Unmarshal(data)
}
func (p *PartitionByDef) MarshalPartitionInfo() ([]byte, error) {
data := make([]byte, p.ProtoSize())
_, err := p.MarshalTo(data)
return data, err
}
func (p *PartitionByDef) UnMarshalPartitionInfo(data []byte) error {
return p.Unmarshal(data)
}
func (m *OnUpdate) MarshalBinary() ([]byte, error) {
return m.Marshal()
}
func (m *OnUpdate) UnmarshalBinary(data []byte) error {
return m.Unmarshal(data)
}
func (m *Default) MarshalBinary() ([]byte, error) {
return m.Marshal()
}
func (m *Default) UnmarshalBinary(data []byte) error {
return m.Unmarshal(data)
}
func (m CreateTable) IsSystemExternalRel() bool {
return m.TableDef.TableType == SystemExternalRel
}
func (p *PartitionByDef) GenPartitionExprString() string {
switch p.Type {
case PartitionType_HASH, PartitionType_LINEAR_HASH,
PartitionType_RANGE, PartitionType_LIST:
return p.PartitionExpr.ExprStr
case PartitionType_KEY, PartitionType_LINEAR_KEY,
PartitionType_LIST_COLUMNS, PartitionType_RANGE_COLUMNS:
partitionColumns := p.PartitionColumns
buf := bytes.NewBuffer(make([]byte, 0, 128))
for i, column := range partitionColumns.PartitionColumns {
if i == 0 {
buf.WriteString(column)
} else {
buf.WriteString(",")
buf.WriteString(column)
}
}
return buf.String()
default:
return ""
}
}