408 lines
8.9 KiB
Go
408 lines
8.9 KiB
Go
// Copyright 2015 PingCAP, Inc.
|
|
//
|
|
// 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,
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package model
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
"unsafe"
|
|
|
|
"github.com/pingcap/errors"
|
|
)
|
|
|
|
// TableLockType is the type of the table lock.
|
|
type TableLockType byte
|
|
|
|
const (
|
|
// TableLockNone means this table lock is absent.
|
|
TableLockNone TableLockType = iota
|
|
// TableLockRead means the session with this lock can read the table (but not write it).
|
|
// Multiple sessions can acquire a READ lock for the table at the same time.
|
|
// Other sessions can read the table without explicitly acquiring a READ lock.
|
|
TableLockRead
|
|
// TableLockReadLocal is not supported.
|
|
TableLockReadLocal
|
|
// TableLockReadOnly is used to set a table into read-only status,
|
|
// when the session exits, it will not release its lock automatically.
|
|
TableLockReadOnly
|
|
// TableLockWrite means only the session with this lock has write/read permission.
|
|
// Only the session that holds the lock can access the table. No other session can access it until the lock is released.
|
|
TableLockWrite
|
|
// TableLockWriteLocal means the session with this lock has write/read permission, and the other session still has read permission.
|
|
TableLockWriteLocal
|
|
)
|
|
|
|
// String implements fmt.Stringer interface.
|
|
func (t TableLockType) String() string {
|
|
switch t {
|
|
case TableLockNone:
|
|
return "NONE"
|
|
case TableLockRead:
|
|
return "READ"
|
|
case TableLockReadLocal:
|
|
return "READ LOCAL"
|
|
case TableLockReadOnly:
|
|
return "READ ONLY"
|
|
case TableLockWriteLocal:
|
|
return "WRITE LOCAL"
|
|
case TableLockWrite:
|
|
return "WRITE"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// ViewAlgorithm is VIEW's SQL ALGORITHM characteristic.
|
|
// See https://dev.mysql.com/doc/refman/5.7/en/view-algorithms.html
|
|
type ViewAlgorithm int
|
|
|
|
// ViewAlgorithm values.
|
|
const (
|
|
AlgorithmUndefined ViewAlgorithm = iota
|
|
AlgorithmMerge
|
|
AlgorithmTemptable
|
|
)
|
|
|
|
// String implements fmt.Stringer interface.
|
|
func (v *ViewAlgorithm) String() string {
|
|
switch *v {
|
|
case AlgorithmMerge:
|
|
return "MERGE"
|
|
case AlgorithmTemptable:
|
|
return "TEMPTABLE"
|
|
case AlgorithmUndefined:
|
|
return "UNDEFINED"
|
|
default:
|
|
return "UNDEFINED"
|
|
}
|
|
}
|
|
|
|
// ViewSecurity is VIEW's SQL SECURITY characteristic.
|
|
// See https://dev.mysql.com/doc/refman/5.7/en/create-view.html
|
|
type ViewSecurity int
|
|
|
|
// ViewSecurity values.
|
|
const (
|
|
SecurityDefiner ViewSecurity = iota
|
|
SecurityInvoker
|
|
)
|
|
|
|
// String implements fmt.Stringer interface.
|
|
func (v *ViewSecurity) String() string {
|
|
switch *v {
|
|
case SecurityInvoker:
|
|
return "INVOKER"
|
|
case SecurityDefiner:
|
|
return "DEFINER"
|
|
default:
|
|
return "DEFINER"
|
|
}
|
|
}
|
|
|
|
// ViewCheckOption is VIEW's WITH CHECK OPTION clause part.
|
|
// See https://dev.mysql.com/doc/refman/5.7/en/view-check-option.html
|
|
type ViewCheckOption int
|
|
|
|
// ViewCheckOption values.
|
|
const (
|
|
CheckOptionLocal ViewCheckOption = iota
|
|
CheckOptionCascaded
|
|
)
|
|
|
|
// String implements fmt.Stringer interface.
|
|
func (v *ViewCheckOption) String() string {
|
|
switch *v {
|
|
case CheckOptionLocal:
|
|
return "LOCAL"
|
|
case CheckOptionCascaded:
|
|
return "CASCADED"
|
|
default:
|
|
return "CASCADED"
|
|
}
|
|
}
|
|
|
|
// PartitionType is the type for PartitionInfo
|
|
type PartitionType int
|
|
|
|
// PartitionType types.
|
|
const (
|
|
// Actually non-partitioned, but during DDL keeping the table as
|
|
// a single partition
|
|
PartitionTypeNone PartitionType = 0
|
|
|
|
PartitionTypeRange PartitionType = 1
|
|
PartitionTypeHash PartitionType = 2
|
|
PartitionTypeList PartitionType = 3
|
|
PartitionTypeKey PartitionType = 4
|
|
PartitionTypeSystemTime PartitionType = 5
|
|
)
|
|
|
|
// String implements fmt.Stringer interface.
|
|
func (p PartitionType) String() string {
|
|
switch p {
|
|
case PartitionTypeRange:
|
|
return "RANGE"
|
|
case PartitionTypeHash:
|
|
return "HASH"
|
|
case PartitionTypeList:
|
|
return "LIST"
|
|
case PartitionTypeKey:
|
|
return "KEY"
|
|
case PartitionTypeSystemTime:
|
|
return "SYSTEM_TIME"
|
|
case PartitionTypeNone:
|
|
return "NONE"
|
|
default:
|
|
return ""
|
|
}
|
|
}
|
|
|
|
// PrimaryKeyType is the type of primary key.
|
|
// Available values are "clustered", "nonclustered", and ""(default).
|
|
type PrimaryKeyType int8
|
|
|
|
// String implements fmt.Stringer interface.
|
|
func (p PrimaryKeyType) String() string {
|
|
switch p {
|
|
case PrimaryKeyTypeClustered:
|
|
return "CLUSTERED"
|
|
case PrimaryKeyTypeNonClustered:
|
|
return "NONCLUSTERED"
|
|
default:
|
|
return ""
|
|
}
|
|
}
|
|
|
|
// PrimaryKeyType values.
|
|
const (
|
|
PrimaryKeyTypeDefault PrimaryKeyType = iota
|
|
PrimaryKeyTypeClustered
|
|
PrimaryKeyTypeNonClustered
|
|
)
|
|
|
|
// IndexType is the type of index
|
|
type IndexType int
|
|
|
|
// String implements Stringer interface.
|
|
func (t IndexType) String() string {
|
|
switch t {
|
|
case IndexTypeBtree:
|
|
return "BTREE"
|
|
case IndexTypeHash:
|
|
return "HASH"
|
|
case IndexTypeRtree:
|
|
return "RTREE"
|
|
case IndexTypeHypo:
|
|
return "HYPO"
|
|
case IndexTypeHNSW:
|
|
return "HNSW"
|
|
default:
|
|
return ""
|
|
}
|
|
}
|
|
|
|
// IndexTypes
|
|
const (
|
|
IndexTypeInvalid IndexType = iota
|
|
IndexTypeBtree
|
|
IndexTypeHash
|
|
IndexTypeRtree
|
|
IndexTypeHypo
|
|
IndexTypeHNSW
|
|
)
|
|
|
|
// ReferOptionType is the type for refer options.
|
|
type ReferOptionType int
|
|
|
|
// Refer option types.
|
|
const (
|
|
ReferOptionNoOption ReferOptionType = iota
|
|
ReferOptionRestrict
|
|
ReferOptionCascade
|
|
ReferOptionSetNull
|
|
ReferOptionNoAction
|
|
ReferOptionSetDefault
|
|
)
|
|
|
|
// String implements fmt.Stringer interface.
|
|
func (r ReferOptionType) String() string {
|
|
switch r {
|
|
case ReferOptionRestrict:
|
|
return "RESTRICT"
|
|
case ReferOptionCascade:
|
|
return "CASCADE"
|
|
case ReferOptionSetNull:
|
|
return "SET NULL"
|
|
case ReferOptionNoAction:
|
|
return "NO ACTION"
|
|
case ReferOptionSetDefault:
|
|
return "SET DEFAULT"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// CIStr is case insensitive string.
|
|
type CIStr struct {
|
|
O string `json:"O"` // Original string.
|
|
L string `json:"L"` // Lower case string.
|
|
}
|
|
|
|
// String implements fmt.Stringer interface.
|
|
func (cis CIStr) String() string {
|
|
return cis.O
|
|
}
|
|
|
|
// NewCIStr creates a new CIStr.
|
|
func NewCIStr(s string) (cs CIStr) {
|
|
cs.O = s
|
|
cs.L = strings.ToLower(s)
|
|
return
|
|
}
|
|
|
|
// UnmarshalJSON implements the user defined unmarshal method.
|
|
// CIStr can be unmarshaled from a single string, so PartitionDefinition.Name
|
|
// in this change https://github.com/pingcap/tidb/pull/6460/files would be
|
|
// compatible during TiDB upgrading.
|
|
func (cis *CIStr) UnmarshalJSON(b []byte) error {
|
|
type T CIStr
|
|
if err := json.Unmarshal(b, (*T)(cis)); err == nil {
|
|
return nil
|
|
}
|
|
|
|
// Unmarshal CIStr from a single string.
|
|
err := json.Unmarshal(b, &cis.O)
|
|
if err != nil {
|
|
return errors.Trace(err)
|
|
}
|
|
cis.L = strings.ToLower(cis.O)
|
|
return nil
|
|
}
|
|
|
|
// MemoryUsage return the memory usage of CIStr
|
|
func (cis *CIStr) MemoryUsage() (sum int64) {
|
|
if cis == nil {
|
|
return
|
|
}
|
|
|
|
return int64(unsafe.Sizeof(cis.O))*2 + int64(len(cis.O)+len(cis.L))
|
|
}
|
|
|
|
// RunawayActionType is the type of runaway action.
|
|
type RunawayActionType int32
|
|
|
|
// RunawayActionType values.
|
|
const (
|
|
RunawayActionNone RunawayActionType = iota
|
|
RunawayActionDryRun
|
|
RunawayActionCooldown
|
|
RunawayActionKill
|
|
RunawayActionSwitchGroup
|
|
)
|
|
|
|
// RunawayWatchType is the type of runaway watch.
|
|
type RunawayWatchType int32
|
|
|
|
// RunawayWatchType values.
|
|
const (
|
|
WatchNone RunawayWatchType = iota
|
|
WatchExact
|
|
WatchSimilar
|
|
WatchPlan
|
|
)
|
|
|
|
// String implements fmt.Stringer interface.
|
|
func (t RunawayWatchType) String() string {
|
|
switch t {
|
|
case WatchExact:
|
|
return "EXACT"
|
|
case WatchSimilar:
|
|
return "SIMILAR"
|
|
case WatchPlan:
|
|
return "PLAN"
|
|
default:
|
|
return "NONE"
|
|
}
|
|
}
|
|
|
|
// RunawayOptionType is the runaway's option type.
|
|
type RunawayOptionType int
|
|
|
|
// RunawayOptionType values.
|
|
const (
|
|
RunawayRule RunawayOptionType = iota
|
|
RunawayAction
|
|
RunawayWatch
|
|
)
|
|
|
|
// String implements fmt.Stringer interface.
|
|
func (t RunawayActionType) String() string {
|
|
switch t {
|
|
case RunawayActionDryRun:
|
|
return "DRYRUN"
|
|
case RunawayActionCooldown:
|
|
return "COOLDOWN"
|
|
case RunawayActionKill:
|
|
return "KILL"
|
|
case RunawayActionSwitchGroup:
|
|
return "SWITCH_GROUP"
|
|
default:
|
|
return "DRYRUN"
|
|
}
|
|
}
|
|
|
|
// ColumnChoice is the type of the column choice.
|
|
type ColumnChoice byte
|
|
|
|
// ColumnChoice values.
|
|
const (
|
|
DefaultChoice ColumnChoice = iota
|
|
AllColumns
|
|
PredicateColumns
|
|
ColumnList
|
|
)
|
|
|
|
// String implements fmt.Stringer interface.
|
|
func (s ColumnChoice) String() string {
|
|
switch s {
|
|
case AllColumns:
|
|
return "ALL"
|
|
case PredicateColumns:
|
|
return "PREDICATE"
|
|
case ColumnList:
|
|
return "LIST"
|
|
default:
|
|
return "DEFAULT"
|
|
}
|
|
}
|
|
|
|
// Priority values.
|
|
const (
|
|
LowPriorityValue = 1
|
|
MediumPriorityValue = 8
|
|
HighPriorityValue = 16
|
|
)
|
|
|
|
// PriorityValueToName converts the priority value to corresponding name
|
|
func PriorityValueToName(value uint64) string {
|
|
switch value {
|
|
case LowPriorityValue:
|
|
return "LOW"
|
|
case MediumPriorityValue:
|
|
return "MEDIUM"
|
|
case HighPriorityValue:
|
|
return "HIGH"
|
|
default:
|
|
return "MEDIUM"
|
|
}
|
|
}
|