common

package
v0.6.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 29, 2022 License: Apache-2.0 Imports: 21 Imported by: 0

Documentation

Overview

A few allocators for TAE

Index

Constants

View Source
const (
	MAX_UINT8  = ^uint8(0)
	MAX_UINT16 = ^uint16(0)
	MAX_UINT32 = ^uint32(0)
	MAX_UINT64 = ^uint64(0)

	K = 1024
	M = 1024 * K
	G = 1024 * M
	T = 1024 * G
	P = 1024 * T
)
View Source
const (
	TmpSuffix  = ".tmp"
	LockSuffix = ".lock"
)

Variables

View Source
var (
	ErrRangeNotContinuous = moerr.NewInternalError("tae: range not continuous")
	ErrRangeInvalid       = moerr.NewInternalError("tae: invalid range")
)
View Source
var AnyField = zap.Any
View Source
var CacheAllocator *mpool.MPool
View Source
var DefaultAllocator *mpool.MPool

A few allocators for TAE

View Source
var (
	ErrClose = moerr.NewInternalError("closed")
)
View Source
var (
	GlobalSeqNum atomic.Uint64
)
View Source
var LogAllocator *mpool.MPool
View Source
var MutMemAllocator *mpool.MPool
View Source
var StringerField = zap.Stringer

Functions

func BM32Window

func BM32Window(bm *roaring.Bitmap, start, end int) *roaring.Bitmap

func BM64Window

func BM64Window(bm *roaring64.Bitmap, start, end int) *roaring64.Bitmap

func Compress added in v0.6.0

func Compress(raw []byte, ctyp CompressType) []byte

func ContextField

func ContextField(format string, a ...any) zap.Field

func CountField

func CountField(val int) zap.Field

func Decompress added in v0.6.0

func Decompress(src []byte, dst []byte, ctyp CompressType) error

func DoRetry

func DoRetry(op RetryOp, ctx context.Context) (err error)

func DurationField

func DurationField(val time.Duration) zap.Field

func EntityField

func EntityField(val any) zap.Field

func ErrorField

func ErrorField(val error) zap.Field

func ExceptionField

func ExceptionField(val any) zap.Field

func FormatFiled

func FormatFiled(key string, format string, a ...any) zap.Field

func GetGlobalSeqNum

func GetGlobalSeqNum() uint64

func IDArraryString

func IDArraryString(ids []ID) string

func IDField

func IDField(val int) zap.Field

func InitTAEMPool added in v0.6.0

func InitTAEMPool()

func InplaceDeleteRows added in v0.6.0

func InplaceDeleteRows(orig any, rowGen RowGen) any

func InplaceDeleteRowsFromSlice added in v0.6.0

func InplaceDeleteRowsFromSlice[T types.FixedSizeT](v any, rowGen RowGen) any

func LoopGenericSortedDList added in v0.6.0

func LoopGenericSortedDList[T any](head *GenericDLNode[T],
	fn func(node *GenericDLNode[T]) bool,
	reverse bool)

Loop the list and apply fn on each node head is the head node of a list fn is operation applied to each node during iterating. if fn(node) returns false, stop iterating. reverse is true to loop in reversed way.

func MakeFilename

func MakeFilename(dirname string, ft FileT, name string, isTmp bool) string

func MakeLockFileName

func MakeLockFileName(dirname, name string) string

func MockRWFile

func MockRWFile() *rwFile

func NameSpaceField

func NameSpaceField(val string) zap.Field

func NextGlobalSeqNum

func NextGlobalSeqNum() uint64

func OperandField

func OperandField(val any) zap.Field

func OperandNameSpace

func OperandNameSpace() zap.Field

func OperationField

func OperationField(val string) zap.Field

func ReadString

func ReadString(r io.Reader) (str string, n int64, err error)

func ReasonField

func ReasonField(val string) zap.Field

func RepeatStr

func RepeatStr(str string, times int) string

func ReprerField

func ReprerField(key string, val Reprer) zap.Field

func TimestampField

func TimestampField(val any) zap.Field

func TypeStringValue added in v0.6.0

func TypeStringValue(t types.Type, v any, opts ...TypePrintOpt) string

func WriteString

func WriteString(str string, w io.Writer) (n int64, err error)

Types

type BaseTreeVisitor added in v0.6.0

type BaseTreeVisitor struct {
	TableFn   func(uint64, uint64) error
	SegmentFn func(uint64, uint64, uint64) error
	BlockFn   func(uint64, uint64, uint64, uint64) error
}

func (*BaseTreeVisitor) String added in v0.6.0

func (visitor *BaseTreeVisitor) String() string

func (*BaseTreeVisitor) VisitBlock added in v0.6.0

func (visitor *BaseTreeVisitor) VisitBlock(
	dbID, tableID, segmentID, blockID uint64) (err error)

func (*BaseTreeVisitor) VisitSegment added in v0.6.0

func (visitor *BaseTreeVisitor) VisitSegment(dbID, tableID, segmentID uint64) (err error)

func (*BaseTreeVisitor) VisitTable added in v0.6.0

func (visitor *BaseTreeVisitor) VisitTable(dbID, tableID uint64) (err error)

type Closable

type Closable interface {
	IsClosed() bool
	TryClose() bool
}

type ClosedInterval

type ClosedInterval struct {
	Start, End uint64
}

func (*ClosedInterval) Append

func (i *ClosedInterval) Append(id uint64) error

func (*ClosedInterval) AtomicUpdateEnd

func (i *ClosedInterval) AtomicUpdateEnd(v uint64)

func (*ClosedInterval) Contains

func (i *ClosedInterval) Contains(o ClosedInterval) bool

func (*ClosedInterval) GT

func (*ClosedInterval) IsCoveredByInt

func (i *ClosedInterval) IsCoveredByInt(idx uint64) bool

func (*ClosedInterval) LT

func (*ClosedInterval) String

func (i *ClosedInterval) String() string

func (*ClosedInterval) TryMerge

func (i *ClosedInterval) TryMerge(o ClosedInterval) bool

type ClosedIntervals

type ClosedIntervals struct {
	Intervals []*ClosedInterval
}

func NewClosedIntervals

func NewClosedIntervals() *ClosedIntervals

func NewClosedIntervalsByInt

func NewClosedIntervalsByInt(i uint64) *ClosedIntervals

func NewClosedIntervalsByInterval

func NewClosedIntervalsByInterval(i *ClosedInterval) *ClosedIntervals

func NewClosedIntervalsByIntervals

func NewClosedIntervalsByIntervals(i *ClosedIntervals) *ClosedIntervals

func NewClosedIntervalsBySlice

func NewClosedIntervalsBySlice(array []uint64) *ClosedIntervals

func (*ClosedIntervals) Contains

func (intervals *ClosedIntervals) Contains(o ClosedIntervals) bool

func (*ClosedIntervals) ContainsInt added in v0.6.0

func (intervals *ClosedIntervals) ContainsInt(n uint64) bool

func (*ClosedIntervals) ContainsInterval

func (intervals *ClosedIntervals) ContainsInterval(oIntervals ClosedInterval) bool

func (*ClosedIntervals) Equal

func (intervals *ClosedIntervals) Equal(o *ClosedIntervals) bool

Equal is for test

func (*ClosedIntervals) GetCardinality

func (intervals *ClosedIntervals) GetCardinality() int

func (*ClosedIntervals) GetMax added in v0.6.0

func (intervals *ClosedIntervals) GetMax() uint64

func (*ClosedIntervals) GetMin added in v0.6.0

func (intervals *ClosedIntervals) GetMin() uint64

func (*ClosedIntervals) IsCoveredByInt

func (intervals *ClosedIntervals) IsCoveredByInt(i uint64) bool

func (*ClosedIntervals) ReadFrom

func (intervals *ClosedIntervals) ReadFrom(r io.Reader) (n int64, err error)

func (*ClosedIntervals) TryMerge

func (intervals *ClosedIntervals) TryMerge(o ClosedIntervals)

func (*ClosedIntervals) WriteTo

func (intervals *ClosedIntervals) WriteTo(w io.Writer) (n int64, err error)

type ClosedState

type ClosedState struct {
	// contains filtered or unexported fields
}

func (*ClosedState) IsClosed

func (c *ClosedState) IsClosed() bool

func (*ClosedState) TryClose

func (c *ClosedState) TryClose() bool

type CompressType added in v0.6.0

type CompressType uint8
const (
	Plain CompressType = iota
	Lz4
)

type FileInfo

type FileInfo interface {
	Name() string
	Size() int64
	OriginSize() int64
	CompressAlgo() int
}

FileInfo contains the basic info for a file.

type FileT

type FileT int
const (
	FTLock FileT = iota
)

type FileType

type FileType uint8
const (
	InvalidFile FileType = iota
	MemFile
	DiskFile
)

type GenericDLNode added in v0.6.0

type GenericDLNode[T any] struct {
	// contains filtered or unexported fields
}

Doubly sorted linked-list node

func InsertGenericDLNode added in v0.6.0

func InsertGenericDLNode[T any](payload T,
	head *GenericDLNode[T],
	compare func(T, T) int) (node, nhead, ntail *GenericDLNode[T])

Insert a wrapped object into a list specified by a head node node is the inserted dlnode nhead is the new head node ntail is the new tail node. If ntail is not nil, tail is updated. Else tail is not updated

func (*GenericDLNode[T]) GetNext added in v0.6.0

func (l *GenericDLNode[T]) GetNext() *GenericDLNode[T]

func (*GenericDLNode[T]) GetPayload added in v0.6.0

func (l *GenericDLNode[T]) GetPayload() T

func (*GenericDLNode[T]) GetPrev added in v0.6.0

func (l *GenericDLNode[T]) GetPrev() *GenericDLNode[T]

func (*GenericDLNode[T]) KeepSorted added in v0.6.0

func (l *GenericDLNode[T]) KeepSorted(compare func(T, T) int) (head, tail *GenericDLNode[T])

Keep node be sorted in the list

type GenericSortedDList added in v0.6.0

type GenericSortedDList[T any] struct {
	// contains filtered or unexported fields
}

Sorted doubly linked-list

func NewGenericSortedDList added in v0.6.0

func NewGenericSortedDList[T any](compare func(T, T) int) *GenericSortedDList[T]

func (*GenericSortedDList[T]) Delete added in v0.6.0

func (l *GenericSortedDList[T]) Delete(n *GenericDLNode[T])

Given a node and remove it from the list

Delete [node]

[prev node] <-> [node] <-> [next node] =============> [prev node] <-> [next node]

func (*GenericSortedDList[T]) Depth added in v0.6.0

func (l *GenericSortedDList[T]) Depth() int

Get the length of the list

func (*GenericSortedDList[T]) GetHead added in v0.6.0

func (l *GenericSortedDList[T]) GetHead() *GenericDLNode[T]

Get the head node

func (*GenericSortedDList[T]) GetTail added in v0.6.0

func (l *GenericSortedDList[T]) GetTail() *GenericDLNode[T]

Get the tail node

func (*GenericSortedDList[T]) Insert added in v0.6.0

func (l *GenericSortedDList[T]) Insert(payload T) *GenericDLNode[T]

Insert a object and wrap it as GenericDLNode into the list The inserted object must be instance of interface NodePayload [List]: [1,x1] <-> [5,x5] <-> [10,x10] Insert a node [7,x7] [List]: [1,x1] <-> [5,x5] <-> [7,x7] <-> [10,x10]

func (*GenericSortedDList[T]) Loop added in v0.6.0

func (l *GenericSortedDList[T]) Loop(fn func(n *GenericDLNode[T]) bool, reverse bool)

Loop the list and apply fn on each node

func (*GenericSortedDList[T]) Update added in v0.6.0

func (l *GenericSortedDList[T]) Update(n *GenericDLNode[T])

Update the node to keep the list be sorted

[List] [1,x1] <-> [3,x3] <-> [10,x10] <-> [20,x20]

|

[Node] [10,x10]

--------- UPDATE [10,x10] TO [2, x10]--------------

[List] [1,x1] <-> [2,x10] <-> [3,x3] <-> [20,x20]

type GenericSortedDListIt added in v0.6.0

type GenericSortedDListIt[T any] struct {
	// contains filtered or unexported fields
}

Sorted doubly linked-list iterator

func NewGenericSortedDListIt added in v0.6.0

func NewGenericSortedDListIt[T any](linkLocker *sync.RWMutex,
	dlist *GenericSortedDList[T],
	reverse bool) *GenericSortedDListIt[T]

linkLocker is the outer locker to guard dlist access

func (*GenericSortedDListIt[T]) Get added in v0.6.0

func (it *GenericSortedDListIt[T]) Get() *GenericDLNode[T]

func (*GenericSortedDListIt[T]) Next added in v0.6.0

func (it *GenericSortedDListIt[T]) Next()

func (*GenericSortedDListIt[T]) Valid added in v0.6.0

func (it *GenericSortedDListIt[T]) Valid() bool

type ID

type ID struct {
	// Internal table id
	TableID uint64
	// Internal segment id
	SegmentID uint64
	// Internal block id
	BlockID uint64
	// Internal column part id
	PartID uint32
	// Column index for the column part above
	Idx uint16
	// Iter is used for MVCC
	Iter uint8
}

ID is the general identifier type shared by different types like table, segment, block, etc.

We could wrap info from upper level via ID, for instance, get the table id, segment id, and the block id for one block by ID.AsBlockID, which made the resource management easier.

func (*ID) AsBlockID

func (id *ID) AsBlockID() ID

func (*ID) AsSegmentID

func (id *ID) AsSegmentID() ID

func (*ID) BlockString

func (id *ID) BlockString() string

func (*ID) IsSameBlock

func (id *ID) IsSameBlock(o ID) bool

func (*ID) IsSameSegment

func (id *ID) IsSameSegment(o ID) bool

func (*ID) NextBlock

func (id *ID) NextBlock() ID

func (*ID) NextSegment

func (id *ID) NextSegment() ID

func (*ID) SegmentString

func (id *ID) SegmentString() string

func (*ID) String

func (id *ID) String() string

func (*ID) TableString

func (id *ID) TableString() string

type IRWFile

type IRWFile interface {
	io.Writer
	IVFile
}

type IRef

type IRef interface {
	RefCount() int64
	Ref()
	Unref()
}

IRef is the general representation of the resources that should be managed with a reference count. Once the reference count reached 0, the OnZeroCB would be called.

type ISLLNode

type ISLLNode interface {
	IRef
}

type ISSLLNode

type ISSLLNode interface {
	Insert(ISSLLNode)
	GetNext() ISSLLNode
	SetNext(ISSLLNode)
	ReleaseNextNode() ISSLLNode
	ReleaseFollowing() ISSLLNode
}

type IVFile

type IVFile interface {
	io.Reader
	Ref()
	Unref()
	RefCount() int64
	Stat() FileInfo
	GetFileType() FileType
}

IVFile is the general in-memory representation of resources like segment, block, index, column part, etc. that managed by buffer manager.

func MockCompressedFile

func MockCompressedFile(size int64, osize int64) IVFile

func NewMemFile

func NewMemFile(size int64) IVFile

type IdAllocator

type IdAllocator struct {
	// contains filtered or unexported fields
}

func (*IdAllocator) Alloc

func (id *IdAllocator) Alloc() uint64

func (*IdAllocator) Get

func (id *IdAllocator) Get() uint64

func (*IdAllocator) Set

func (id *IdAllocator) Set(val uint64)

type IdAlloctor

type IdAlloctor struct {
	// contains filtered or unexported fields
}

func NewIdAlloctor

func NewIdAlloctor(from uint64) *IdAlloctor

func (*IdAlloctor) Alloc

func (alloc *IdAlloctor) Alloc() uint64

func (*IdAlloctor) Get

func (alloc *IdAlloctor) Get() uint64

func (*IdAlloctor) SetStart

func (alloc *IdAlloctor) SetStart(start uint64)

type OffsetT added in v0.6.0

type OffsetT interface {
	int | uint32
}

type OnZeroCB

type OnZeroCB func()

type PPLevel

type PPLevel int8
const (
	PPL0 PPLevel = iota
	PPL1
	PPL2
	PPL3
)

type PinnedItem added in v0.6.0

type PinnedItem[T IRef] struct {
	Val T
}

func (*PinnedItem[T]) Close added in v0.6.0

func (item *PinnedItem[T]) Close()

func (*PinnedItem[T]) Item added in v0.6.0

func (item *PinnedItem[T]) Item() T

type Range

type Range struct {
	Left  uint64 `json:"l"`
	Right uint64 `json:"r"`
}

func (*Range) Append

func (r *Range) Append(right uint64) error

func (*Range) CanCover

func (r *Range) CanCover(o *Range) bool

func (*Range) ClosedIn

func (r *Range) ClosedIn(id uint64) bool

func (*Range) CommitLeft

func (r *Range) CommitLeft(left uint64) bool

func (*Range) GT

func (r *Range) GT(id uint64) bool

func (*Range) LT

func (r *Range) LT(id uint64) bool

func (*Range) String

func (r *Range) String() string

func (*Range) Union

func (r *Range) Union(o *Range) error

func (*Range) Valid

func (r *Range) Valid() bool

type RefHelper

type RefHelper struct {
	Refs     atomic.Int64
	OnZeroCB OnZeroCB
}

func (*RefHelper) Ref

func (helper *RefHelper) Ref()

func (*RefHelper) RefCount

func (helper *RefHelper) RefCount() int64

func (*RefHelper) Unref

func (helper *RefHelper) Unref()

type Reprer

type Reprer interface {
	Repr() string
}

type RetryOp

type RetryOp = func() error

type RowGen

type RowGen interface {
	HasNext() bool
	Next() uint32
}

type RowGenWrapper added in v0.6.0

type RowGenWrapper[T OffsetT] struct {
	Sels []T
	Idx  int
}

func NewRowGenWrapper added in v0.6.0

func NewRowGenWrapper[T OffsetT](sels ...T) *RowGenWrapper[T]

func (*RowGenWrapper[T]) HasNext added in v0.6.0

func (wrapper *RowGenWrapper[T]) HasNext() bool

func (*RowGenWrapper[T]) Next added in v0.6.0

func (wrapper *RowGenWrapper[T]) Next() uint32

type SLLNode

type SLLNode struct {
	RefHelper
	*sync.RWMutex
	Next ISLLNode
}

SLLNode represent a single node in linked list. It is thread-safe.

func NewSLLNode

func NewSLLNode(mu *sync.RWMutex) *SLLNode

func (*SLLNode) GetNextNode

func (l *SLLNode) GetNextNode() ISLLNode

func (*SLLNode) Insert

func (l *SLLNode) Insert(n ISLLNode)

func (*SLLNode) ReleaseNextNode

func (l *SLLNode) ReleaseNextNode()

func (*SLLNode) SetNextNode

func (l *SLLNode) SetNextNode(next ISLLNode)

func (*SLLNode) SetNextNodeNoLock

func (l *SLLNode) SetNextNodeNoLock(next ISLLNode)

type SSLLNode

type SSLLNode struct {
	// contains filtered or unexported fields
}

func NewSSLLNode

func NewSSLLNode() *SSLLNode

func (*SSLLNode) GetNext

func (n *SSLLNode) GetNext() ISSLLNode

func (*SSLLNode) Insert

func (n *SSLLNode) Insert(nn ISSLLNode)

func (*SSLLNode) ReleaseFollowing

func (n *SSLLNode) ReleaseFollowing() ISSLLNode

func (*SSLLNode) ReleaseNextNode

func (n *SSLLNode) ReleaseNextNode() ISSLLNode

func (*SSLLNode) SetNext

func (n *SSLLNode) SetNext(next ISSLLNode)

type SegmentTree added in v0.6.0

type SegmentTree struct {
	ID   uint64
	Blks map[uint64]bool
}

func NewSegmentTree added in v0.6.0

func NewSegmentTree(id uint64) *SegmentTree

func (*SegmentTree) AddBlock added in v0.6.0

func (stree *SegmentTree) AddBlock(id uint64)

func (*SegmentTree) Equal added in v0.6.0

func (stree *SegmentTree) Equal(o *SegmentTree) bool

func (*SegmentTree) IsEmpty added in v0.6.0

func (stree *SegmentTree) IsEmpty() bool

func (*SegmentTree) Merge added in v0.6.0

func (stree *SegmentTree) Merge(ot *SegmentTree)

func (*SegmentTree) ReadFrom added in v0.6.0

func (stree *SegmentTree) ReadFrom(r io.Reader) (n int64, err error)

func (*SegmentTree) Shrink added in v0.6.0

func (stree *SegmentTree) Shrink(id uint64) (empty bool)

func (*SegmentTree) WriteTo added in v0.6.0

func (stree *SegmentTree) WriteTo(w io.Writer) (n int64, err error)

type TableTree added in v0.6.0

type TableTree struct {
	DbID uint64
	ID   uint64
	Segs map[uint64]*SegmentTree
}

func NewTableTree added in v0.6.0

func NewTableTree(dbID, id uint64) *TableTree

func (*TableTree) AddBlock added in v0.6.0

func (ttree *TableTree) AddBlock(segID, id uint64)

func (*TableTree) AddSegment added in v0.6.0

func (ttree *TableTree) AddSegment(id uint64)

func (*TableTree) Compact added in v0.6.0

func (ttree *TableTree) Compact() (empty bool)

func (*TableTree) Equal added in v0.6.0

func (ttree *TableTree) Equal(o *TableTree) bool

func (*TableTree) GetSegment added in v0.6.0

func (ttree *TableTree) GetSegment(id uint64) *SegmentTree

func (*TableTree) IsEmpty added in v0.6.0

func (ttree *TableTree) IsEmpty() bool

func (*TableTree) Merge added in v0.6.0

func (ttree *TableTree) Merge(ot *TableTree)

func (*TableTree) ReadFrom added in v0.6.0

func (ttree *TableTree) ReadFrom(r io.Reader) (n int64, err error)

func (*TableTree) Shrink added in v0.6.0

func (ttree *TableTree) Shrink(segID uint64) (empty bool)

func (*TableTree) WriteTo added in v0.6.0

func (ttree *TableTree) WriteTo(w io.Writer) (n int64, err error)

type Tree added in v0.6.0

type Tree struct {
	Tables map[uint64]*TableTree
}

func NewTree added in v0.6.0

func NewTree() *Tree

func (*Tree) AddBlock added in v0.6.0

func (tree *Tree) AddBlock(dbID, tableID, segID, id uint64)

func (*Tree) AddSegment added in v0.6.0

func (tree *Tree) AddSegment(dbID, tableID, id uint64)

func (*Tree) AddTable added in v0.6.0

func (tree *Tree) AddTable(dbID, id uint64)

func (*Tree) Compact added in v0.6.0

func (tree *Tree) Compact() (empty bool)

func (*Tree) Equal added in v0.6.0

func (tree *Tree) Equal(o *Tree) bool

func (*Tree) GetSegment added in v0.6.0

func (tree *Tree) GetSegment(tableID, segID uint64) *SegmentTree

func (*Tree) GetTable added in v0.6.0

func (tree *Tree) GetTable(id uint64) *TableTree

func (*Tree) HasTable added in v0.6.0

func (tree *Tree) HasTable(id uint64) bool

func (*Tree) IsEmpty added in v0.6.0

func (tree *Tree) IsEmpty() bool

func (*Tree) Merge added in v0.6.0

func (tree *Tree) Merge(ot *Tree)

func (*Tree) ReadFrom added in v0.6.0

func (tree *Tree) ReadFrom(r io.Reader) (n int64, err error)

func (*Tree) Reset added in v0.6.0

func (tree *Tree) Reset()

func (*Tree) Shrink added in v0.6.0

func (tree *Tree) Shrink(tableID uint64) (empty bool)

func (*Tree) String added in v0.6.0

func (tree *Tree) String() string

func (*Tree) TableCount added in v0.6.0

func (tree *Tree) TableCount() int

func (*Tree) Visit added in v0.6.0

func (tree *Tree) Visit(visitor TreeVisitor) (err error)

func (*Tree) WriteTo added in v0.6.0

func (tree *Tree) WriteTo(w io.Writer) (n int64, err error)

type TreeVisitor added in v0.6.0

type TreeVisitor interface {
	VisitTable(dbID, id uint64) error
	VisitSegment(dbID, tableID, id uint64) error
	VisitBlock(dbID, tableID, segmentID, id uint64) error
	String() string
}

type TxnIDAllocator added in v0.6.0

type TxnIDAllocator struct {
}

func NewTxnIDAllocator added in v0.6.0

func NewTxnIDAllocator() *TxnIDAllocator

func (*TxnIDAllocator) Alloc added in v0.6.0

func (alloc *TxnIDAllocator) Alloc() []byte

type TypePrintOpt added in v0.6.0

type TypePrintOpt interface {
	// contains filtered or unexported methods
}

type WithDoNotPrintBin added in v0.6.0

type WithDoNotPrintBin struct{}

type WithSpecialRowid added in v0.6.0

type WithSpecialRowid struct{}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL