package pgtype

import (
	
	
	
	
	

	
)
TID is PostgreSQL's Tuple Identifier type. When one does select ctid, * from some_table; it is the data type of the ctid hidden system column. It is currently implemented as a pair unsigned two byte integers. Its conversion functions can be found in src/backend/utils/adt/tid.c in the PostgreSQL sources.
type TID struct {
	BlockNumber  uint32
	OffsetNumber uint16
	Status       Status
}

func ( *TID) ( interface{}) error {
	return fmt.Errorf("cannot convert %v to TID", )
}

func ( TID) () interface{} {
	switch .Status {
	case Present:
		return 
	case Null:
		return nil
	default:
		return .Status
	}
}

func ( *TID) ( interface{}) error {
	if .Status == Present {
		switch v := .(type) {
		case *string:
			* = fmt.Sprintf(`(%d,%d)`, .BlockNumber, .OffsetNumber)
			return nil
		default:
			if ,  := GetAssignToDstType();  {
				return .()
			}
			return fmt.Errorf("unable to assign to %T", )
		}
	}

	return fmt.Errorf("cannot assign %v to %T", , )
}

func ( *TID) ( *ConnInfo,  []byte) error {
	if  == nil {
		* = TID{Status: Null}
		return nil
	}

	if len() < 5 {
		return fmt.Errorf("invalid length for tid: %v", len())
	}

	 := strings.SplitN(string([1:len()-1]), ",", 2)
	if len() < 2 {
		return fmt.Errorf("invalid format for tid")
	}

	,  := strconv.ParseUint([0], 10, 32)
	if  != nil {
		return 
	}

	,  := strconv.ParseUint([1], 10, 16)
	if  != nil {
		return 
	}

	* = TID{BlockNumber: uint32(), OffsetNumber: uint16(), Status: Present}
	return nil
}

func ( *TID) ( *ConnInfo,  []byte) error {
	if  == nil {
		* = TID{Status: Null}
		return nil
	}

	if len() != 6 {
		return fmt.Errorf("invalid length for tid: %v", len())
	}

	* = TID{
		BlockNumber:  binary.BigEndian.Uint32(),
		OffsetNumber: binary.BigEndian.Uint16([4:]),
		Status:       Present,
	}
	return nil
}

func ( TID) ( *ConnInfo,  []byte) ([]byte, error) {
	switch .Status {
	case Null:
		return nil, nil
	case Undefined:
		return nil, errUndefined
	}

	 = append(, fmt.Sprintf(`(%d,%d)`, .BlockNumber, .OffsetNumber)...)
	return , nil
}

func ( TID) ( *ConnInfo,  []byte) ([]byte, error) {
	switch .Status {
	case Null:
		return nil, nil
	case Undefined:
		return nil, errUndefined
	}

	 = pgio.AppendUint32(, .BlockNumber)
	 = pgio.AppendUint16(, .OffsetNumber)
	return , nil
}
Scan implements the database/sql Scanner interface.
func ( *TID) ( interface{}) error {
	if  == nil {
		* = TID{Status: Null}
		return nil
	}

	switch src := .(type) {
	case string:
		return .DecodeText(nil, []byte())
	case []byte:
		 := make([]byte, len())
		copy(, )
		return .DecodeText(nil, )
	}

	return fmt.Errorf("cannot scan %T", )
}
Value implements the database/sql/driver Valuer interface.
func ( TID) () (driver.Value, error) {
	return EncodeValueText()