// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you 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 scalar

import (
	
	
	
	
	
	
	
	

	
	
	
	
	
	
	
	
	
	
	
)

// Scalar represents a single value of a specific DataType as opposed to
// an array.
//
// Scalars are useful for passing single value inputs to compute functions
// (not yet implemented) or for representing individual array elements,
// (with a non-trivial cost though).
type Scalar interface {
	fmt.Stringer
	// IsValid returns true if the value is non-null, otherwise false.
	IsValid() bool
	// The datatype of the value in this scalar
	DataType() arrow.DataType
	// Performs cheap validation checks, returns nil if successful
	Validate() error
	// Perform more expensive validation checks, returns nil if successful
	ValidateFull() error
	// Cast the value to the desired DataType (returns an error if unable to do so)
	// should take semantics into account and modify the value accordingly.
	CastTo(arrow.DataType) (Scalar, error)

	// internal only functions for delegation
	value() interface{}
	equals(Scalar) bool
}

type Releasable interface {
	Release()
	Retain()
}

func validateOptional( *scalar,  interface{},  string) error {
	if .Valid &&  == nil {
		return fmt.Errorf("%s scalar is marked valid but doesn't have a %s", .Type, )
	}
	if !.Valid &&  != nil && !reflect.ValueOf().IsNil() {
		return fmt.Errorf("%s scalar is marked null but has a %s", .Type, )
	}
	return nil
}

type scalar struct {
	Type  arrow.DataType
	Valid bool
}

func ( *scalar) () string {
	if !.Valid {
		return "null"
	}

	return "..."
}

func ( *scalar) () bool { return .Valid }

func ( *scalar) () error {
	if .Type == nil {
		return xerrors.New("scalar lacks a type")
	}
	return nil
}

func ( *scalar) () error {
	return .Validate()
}

func ( scalar) () arrow.DataType { return .Type }

type Null struct {
	scalar
}

// by the time we get here we already know that the rhs is the right type
func ( *Null) ( Scalar) bool {
	debug.Assert(.DataType().ID() == arrow.NULL, "scalar null equals should only receive null")
	return true
}

func ( *Null) () interface{} { return nil }

func ( *Null) ( arrow.DataType) (Scalar, error) {
	return MakeNullScalar(), nil
}

func ( *Null) () ( error) {
	 = .scalar.Validate()
	if  != nil {
		return
	}
	if .Valid {
		 = xerrors.New("null scalar should have Valid = false")
	}
	return
}

func ( *Null) () error { return .Validate() }

var (
	ScalarNull *Null = &Null{scalar{Type: arrow.Null, Valid: false}}
)

type PrimitiveScalar interface {
	Scalar
	Data() []byte
}

type Boolean struct {
	scalar
	Value bool
}

// by the time we get here we already know that the rhs is the right type
func ( *Boolean) ( Scalar) bool {
	return .Value == .(*Boolean).Value
}

func ( *Boolean) () interface{} { return .Value }

func ( *Boolean) () []byte {
	return (*[1]byte)(unsafe.Pointer(&.Value))[:]
}

func ( *Boolean) () string {
	if !.Valid {
		return "null"
	}
	,  := .CastTo(arrow.BinaryTypes.String)
	if  != nil {
		return "..."
	}
	return string(.(*String).Value.Bytes())
}

func ( *Boolean) ( arrow.DataType) (Scalar, error) {
	if !.Valid {
		return MakeNullScalar(), nil
	}

	if .ID() == arrow.STRING {
		return NewStringScalar(strconv.FormatBool(.Value)), nil
	}

	 := 0
	if .Value {
		 = 1
	}

	switch .ID() {
	case arrow.UINT8:
		return NewUint8Scalar(uint8()), nil
	case arrow.INT8:
		return NewInt8Scalar(int8()), nil
	case arrow.UINT16:
		return NewUint16Scalar(uint16()), nil
	case arrow.INT16:
		return NewInt16Scalar(int16()), nil
	case arrow.UINT32:
		return NewUint32Scalar(uint32()), nil
	case arrow.INT32:
		return NewInt32Scalar(int32()), nil
	case arrow.UINT64:
		return NewUint64Scalar(uint64()), nil
	case arrow.INT64:
		return NewInt64Scalar(int64()), nil
	case arrow.FLOAT16:
		return NewFloat16Scalar(float16.New(float32())), nil
	case arrow.FLOAT32:
		return NewFloat32Scalar(float32()), nil
	case arrow.FLOAT64:
		return NewFloat64Scalar(float64()), nil
	default:
		return nil, fmt.Errorf("invalid scalar cast from type bool to type %s", )
	}
}

func ( bool) *Boolean {
	return &Boolean{scalar{arrow.FixedWidthTypes.Boolean, true}, }
}

type Float16 struct {
	scalar
	Value float16.Num
}

func ( *Float16) () interface{} { return .Value }

func ( *Float16) () []byte {
	return (*[arrow.Float16SizeBytes]byte)(unsafe.Pointer(&.Value))[:]
}
func ( *Float16) ( Scalar) bool {
	return .Value == .(*Float16).Value
}
func ( *Float16) ( arrow.DataType) (Scalar, error) {
	if !.Valid {
		return MakeNullScalar(), nil
	}

	if ,  := numericMap[.ID()];  {
		return convertToNumeric(reflect.ValueOf(.Value.Float32()), .valueType, .scalarFunc), nil
	}

	if .ID() == arrow.BOOL {
		return NewBooleanScalar(.Value.Uint16() != 0), nil
	} else if .ID() == arrow.STRING {
		return NewStringScalar(.Value.String()), nil
	}

	return nil, fmt.Errorf("cannot cast non-null float16 scalar to type %s", )
}

func ( *Float16) () string {
	if !.Valid {
		return "null"
	}
	,  := .CastTo(arrow.BinaryTypes.String)
	if  != nil {
		return "..."
	}
	return string(.(*String).Value.Bytes())
}

func ( float32) *Float16 {
	return NewFloat16Scalar(float16.New())
}

func ( float16.Num) *Float16 {
	return &Float16{scalar{arrow.FixedWidthTypes.Float16, true}, }
}

type Decimal128 struct {
	scalar
	Value decimal128.Num
}

func ( *Decimal128) () []byte {
	return (*[arrow.Decimal128SizeBytes]byte)(unsafe.Pointer(&.Value))[:]
}

func ( *Decimal128) () interface{} { return .Value }

func ( *Decimal128) () string {
	if !.Valid {
		return "null"
	}
	,  := .CastTo(arrow.BinaryTypes.String)
	if  != nil {
		return "..."
	}
	return string(.(*String).Value.Bytes())
}

func ( *Decimal128) ( Scalar) bool {
	return .Value == .(*Decimal128).Value
}

func ( *Decimal128) ( arrow.DataType) (Scalar, error) {
	if !.Valid {
		return MakeNullScalar(), nil
	}

	 := .Type.(*arrow.Decimal128Type)

	switch .ID() {
	case arrow.DECIMAL128:
		 := .(*arrow.Decimal128Type)
		,  := .Value.Rescale(.Scale, .Scale)
		if  != nil {
			return nil, 
		}
		if !.FitsInPrecision(.Precision) {
			return nil, fmt.Errorf("decimal128 value %v will not fit in new precision %d", , .Precision)
		}
		return NewDecimal128Scalar(, ), nil
	case arrow.DECIMAL256:
		 := .(*arrow.Decimal256Type)
		,  := decimal256.FromDecimal128(.Value).Rescale(.Scale, .Scale)
		if  != nil {
			return nil, 
		}
		if !.FitsInPrecision(.Precision) {
			return nil, fmt.Errorf("decimal256 value %v will not fit in new precision %d", , .Precision)
		}
		return NewDecimal256Scalar(, ), nil
	case arrow.STRING:
		 := .Type.(*arrow.Decimal128Type)
		 := big.NewFloat(math.Pow10(int(.Scale)))
		 := (&big.Float{}).SetInt(.Value.BigInt())
		return NewStringScalar(.Quo(, ).Text('g', int(.Precision))), nil
	}

	return nil, fmt.Errorf("cannot cast non-nil decimal128 scalar to type %s", )
}

func ( decimal128.Num,  arrow.DataType) *Decimal128 {
	return &Decimal128{scalar{, true}, }
}

type Decimal256 struct {
	scalar
	Value decimal256.Num
}

func ( *Decimal256) () []byte {
	return (*[arrow.Decimal256SizeBytes]byte)(unsafe.Pointer(&.Value))[:]
}

func ( *Decimal256) () interface{} { return .Value }

func ( *Decimal256) () string {
	if !.Valid {
		return "null"
	}
	,  := .CastTo(arrow.BinaryTypes.String)
	if  != nil {
		return "..."
	}
	return string(.(*String).Value.Bytes())
}

func ( *Decimal256) ( Scalar) bool {
	return .Value == .(*Decimal256).Value
}

func ( *Decimal256) ( arrow.DataType) (Scalar, error) {
	if !.Valid {
		return MakeNullScalar(), nil
	}

	 := .Type.(*arrow.Decimal256Type)

	switch .ID() {
	case arrow.DECIMAL256:
		 := .(*arrow.Decimal256Type)
		,  := .Value.Rescale(.Scale, .Scale)
		if  != nil {
			return nil, 
		}
		if !.FitsInPrecision(.Precision) {
			return nil, fmt.Errorf("decimal256 value %v will not fit in new precision %d", , .Precision)
		}
		return NewDecimal256Scalar(, ), nil
	case arrow.STRING:
		 := big.NewFloat(math.Pow10(int(.Scale)))
		 := (&big.Float{}).SetInt(.Value.BigInt())
		return NewStringScalar(.Quo(, ).Text('g', int(.Precision))), nil
	}

	return nil, fmt.Errorf("cannot cast non-nil decimal256 scalar to type %s", )
}

func ( decimal256.Num,  arrow.DataType) *Decimal256 {
	return &Decimal256{scalar{, true}, }
}

type Extension struct {
	scalar
	Value Scalar
}

func ( *Extension) () interface{} { return .Value }
func ( *Extension) ( Scalar) bool {
	return Equals(.Value, .(*Extension).Value)
}
func ( *Extension) () ( error) {
	if  = .scalar.Validate();  != nil {
		return 
	}

	if !.Valid {
		if .Value != nil {
			 = fmt.Errorf("null %s scalar has storage value", .Type)
		}
		return
	}

	switch {
	case .Value == nil:
		 = fmt.Errorf("non-null %s scalar doesn't have a storage value", .Type)
	case !.Value.IsValid():
		 = fmt.Errorf("non-null %s scalar has a null storage value", .Type)
	default:
		if  = .Value.Validate();  != nil {
			 = fmt.Errorf("%s scalar fails validation for storage value: %w", .Type, )
		}
	}
	return
}

func ( *Extension) () error {
	if  := .Validate();  != nil {
		return 
	}

	if .Valid {
		return .Value.ValidateFull()
	}
	return nil
}

func ( *Extension) ( arrow.DataType) (Scalar, error) {
	if !.Valid {
		return MakeNullScalar(), nil
	}

	if arrow.TypeEqual(.Type, ) {
		return , nil
	}

	return nil, fmt.Errorf("cannot cast non-null extension scalar of type %s to type %s", .Type, )
}

func ( *Extension) () string {
	if !.Valid {
		return "null"
	}
	,  := .CastTo(arrow.BinaryTypes.String)
	if  != nil {
		return "..."
	}
	return string(.(*String).Value.Bytes())
}

func ( Scalar,  arrow.DataType) *Extension {
	return &Extension{scalar{, true}, }
}

func convertToNumeric( reflect.Value,  reflect.Type,  reflect.Value) Scalar {
	return .Call([]reflect.Value{.Convert()})[0].Interface().(Scalar)
}

// MakeNullScalar creates a scalar value of the desired type representing a null value
func ( arrow.DataType) Scalar {
	return makeNullFn[byte(.ID()&0x3f)]()
}

func invalidScalarType( arrow.DataType) Scalar {
	panic("invalid scalar type: " + .ID().String())
}

type scalarMakeNullFn func(arrow.DataType) Scalar

var makeNullFn [64]scalarMakeNullFn

func init() {
	makeNullFn = [...]scalarMakeNullFn{
		arrow.NULL:                    func( arrow.DataType) Scalar { return ScalarNull },
		arrow.BOOL:                    func( arrow.DataType) Scalar { return &Boolean{scalar: scalar{, false}} },
		arrow.UINT8:                   func( arrow.DataType) Scalar { return &Uint8{scalar: scalar{, false}} },
		arrow.INT8:                    func( arrow.DataType) Scalar { return &Int8{scalar: scalar{, false}} },
		arrow.UINT16:                  func( arrow.DataType) Scalar { return &Uint16{scalar: scalar{, false}} },
		arrow.INT16:                   func( arrow.DataType) Scalar { return &Int16{scalar: scalar{, false}} },
		arrow.UINT32:                  func( arrow.DataType) Scalar { return &Uint32{scalar: scalar{, false}} },
		arrow.INT32:                   func( arrow.DataType) Scalar { return &Int32{scalar: scalar{, false}} },
		arrow.UINT64:                  func( arrow.DataType) Scalar { return &Uint64{scalar: scalar{, false}} },
		arrow.INT64:                   func( arrow.DataType) Scalar { return &Int64{scalar: scalar{, false}} },
		arrow.FLOAT16:                 func( arrow.DataType) Scalar { return &Float16{scalar: scalar{, false}} },
		arrow.FLOAT32:                 func( arrow.DataType) Scalar { return &Float32{scalar: scalar{, false}} },
		arrow.FLOAT64:                 func( arrow.DataType) Scalar { return &Float64{scalar: scalar{, false}} },
		arrow.STRING:                  func( arrow.DataType) Scalar { return &String{&Binary{scalar: scalar{, false}}} },
		arrow.BINARY:                  func( arrow.DataType) Scalar { return &Binary{scalar: scalar{, false}} },
		arrow.FIXED_SIZE_BINARY:       func( arrow.DataType) Scalar { return &FixedSizeBinary{&Binary{scalar: scalar{, false}}} },
		arrow.DATE32:                  func( arrow.DataType) Scalar { return &Date32{scalar: scalar{, false}} },
		arrow.DATE64:                  func( arrow.DataType) Scalar { return &Date64{scalar: scalar{, false}} },
		arrow.TIMESTAMP:               func( arrow.DataType) Scalar { return &Timestamp{scalar: scalar{, false}} },
		arrow.TIME32:                  func( arrow.DataType) Scalar { return &Time32{scalar: scalar{, false}} },
		arrow.TIME64:                  func( arrow.DataType) Scalar { return &Time64{scalar: scalar{, false}} },
		arrow.INTERVAL_MONTHS:         func( arrow.DataType) Scalar { return &MonthInterval{scalar: scalar{, false}} },
		arrow.INTERVAL_DAY_TIME:       func( arrow.DataType) Scalar { return &DayTimeInterval{scalar: scalar{, false}} },
		arrow.INTERVAL_MONTH_DAY_NANO: func( arrow.DataType) Scalar { return &MonthDayNanoInterval{scalar: scalar{, false}} },
		arrow.DECIMAL128:              func( arrow.DataType) Scalar { return &Decimal128{scalar: scalar{, false}} },
		arrow.LIST:                    func( arrow.DataType) Scalar { return &List{scalar: scalar{, false}} },
		arrow.STRUCT: func( arrow.DataType) Scalar {
			 := .(*arrow.StructType)
			 := make([]Scalar, .NumFields())
			for ,  := range .Fields() {
				[] = MakeNullScalar(.Type)
			}
			return &Struct{scalar: scalar{, false}, Value: }
		},
		arrow.SPARSE_UNION: func( arrow.DataType) Scalar {
			 := .(*arrow.SparseUnionType)
			if .NumFields() == 0 {
				panic("cannot make scalar of empty union type")
			}
			 := make([]Scalar, .NumFields())
			for ,  := range .Fields() {
				[] = MakeNullScalar(.Type)
			}
			return NewSparseUnionScalar(, .TypeCodes()[0], )
		},
		arrow.DENSE_UNION: func( arrow.DataType) Scalar {
			 := .(*arrow.DenseUnionType)
			if .NumFields() == 0 {
				panic("cannot make scalar of empty union type")
			}
			return NewDenseUnionScalar(MakeNullScalar(.Fields()[0].Type), .TypeCodes()[0], )
		},
		arrow.DICTIONARY:   func( arrow.DataType) Scalar { return NewNullDictScalar() },
		arrow.LARGE_STRING: func( arrow.DataType) Scalar { return &LargeString{&String{&Binary{scalar: scalar{, false}}}} },
		arrow.LARGE_BINARY: func( arrow.DataType) Scalar { return &LargeBinary{&Binary{scalar: scalar{, false}}} },
		arrow.LARGE_LIST:   func( arrow.DataType) Scalar { return &LargeList{&List{scalar: scalar{, false}}} },
		arrow.DECIMAL256:   func( arrow.DataType) Scalar { return &Decimal256{scalar: scalar{, false}} },
		arrow.MAP:          func( arrow.DataType) Scalar { return &Map{&List{scalar: scalar{, false}}} },
		arrow.EXTENSION: func( arrow.DataType) Scalar {
			return &Extension{scalar: scalar{, false}, Value: MakeNullScalar(.(arrow.ExtensionType).StorageType())}
		},
		arrow.FIXED_SIZE_LIST: func( arrow.DataType) Scalar { return &FixedSizeList{&List{scalar: scalar{, false}}} },
		arrow.DURATION:        func( arrow.DataType) Scalar { return &Duration{scalar: scalar{, false}} },
		arrow.RUN_END_ENCODED: func( arrow.DataType) Scalar { return &RunEndEncoded{scalar: scalar{, false}} },
		// invalid data types to fill out array size 2^6 - 1
		63: invalidScalarType,
	}

	 := numericMap[arrow.FLOAT16]
	.scalarFunc = reflect.ValueOf(NewFloat16ScalarFromFloat32)
	.valueType = reflect.TypeOf(float32(0))
	numericMap[arrow.FLOAT16] = 
}

// GetScalar creates a scalar object from the value at a given index in the
// passed in array, returns an error if unable to do so.
func ( arrow.Array,  int) (Scalar, error) {
	if .DataType().ID() != arrow.DICTIONARY && .IsNull() {
		return MakeNullScalar(.DataType()), nil
	}

	if  >= .Len() {
		return nil, fmt.Errorf("%w: called GetScalar with index larger than array len",
			arrow.ErrIndex)
	}

	switch arr := .(type) {
	case *array.Binary:
		 := memory.NewBufferBytes(.Value())
		defer .Release()
		return NewBinaryScalar(, .DataType()), nil
	case *array.LargeBinary:
		 := memory.NewBufferBytes(.Value())
		defer .Release()
		return NewLargeBinaryScalar(), nil
	case *array.Boolean:
		return NewBooleanScalar(.Value()), nil
	case *array.Date32:
		return NewDate32Scalar(.Value()), nil
	case *array.Date64:
		return NewDate64Scalar(.Value()), nil
	case *array.DayTimeInterval:
		return NewDayTimeIntervalScalar(.Value()), nil
	case *array.Decimal128:
		return NewDecimal128Scalar(.Value(), .DataType()), nil
	case *array.Decimal256:
		return NewDecimal256Scalar(.Value(), .DataType()), nil
	case *array.Duration:
		return NewDurationScalar(.Value(), .DataType()), nil
	case array.ExtensionArray:
		,  := (.Storage(), )
		if  != nil {
			return nil, 
		}
		return NewExtensionScalar(, .DataType()), nil
	case *array.FixedSizeBinary:
		 := memory.NewBufferBytes(.Value())
		defer .Release()
		return NewFixedSizeBinaryScalar(, .DataType()), nil
	case *array.FixedSizeList:
		 := int(.DataType().(*arrow.FixedSizeListType).Len())
		 := array.NewSlice(.ListValues(), int64(*), int64((+1)*))
		defer .Release()
		return NewFixedSizeListScalarWithType(, .DataType()), nil
	case *array.Float16:
		return NewFloat16Scalar(.Value()), nil
	case *array.Float32:
		return NewFloat32Scalar(.Value()), nil
	case *array.Float64:
		return NewFloat64Scalar(.Value()), nil
	case *array.Int8:
		return NewInt8Scalar(.Value()), nil
	case *array.Int16:
		return NewInt16Scalar(.Value()), nil
	case *array.Int32:
		return NewInt32Scalar(.Value()), nil
	case *array.Int64:
		return NewInt64Scalar(.Value()), nil
	case *array.Uint8:
		return NewUint8Scalar(.Value()), nil
	case *array.Uint16:
		return NewUint16Scalar(.Value()), nil
	case *array.Uint32:
		return NewUint32Scalar(.Value()), nil
	case *array.Uint64:
		return NewUint64Scalar(.Value()), nil
	case *array.List:
		 := .Offsets()
		 := array.NewSlice(.ListValues(), int64([]), int64([+1]))
		defer .Release()
		return NewListScalar(), nil
	case *array.LargeList:
		 := .Offsets()
		 := array.NewSlice(.ListValues(), int64([]), int64([+1]))
		defer .Release()
		return NewLargeListScalar(), nil
	case *array.Map:
		 := .Offsets()
		 := array.NewSlice(.ListValues(), int64([]), int64([+1]))
		defer .Release()
		return NewMapScalar(), nil
	case *array.MonthInterval:
		return NewMonthIntervalScalar(.Value()), nil
	case *array.MonthDayNanoInterval:
		return NewMonthDayNanoIntervalScalar(.Value()), nil
	case *array.Null:
		return ScalarNull, nil
	case *array.String:
		return NewStringScalar(.Value()), nil
	case *array.LargeString:
		return NewLargeStringScalar(.Value()), nil
	case *array.Struct:
		 := make(Vector, .NumField())
		for  := range  {
			,  := (.Field(), )
			if  != nil {
				return nil, 
			}
			[] = 
		}
		return NewStructScalar(, .DataType()), nil
	case *array.Time32:
		return NewTime32Scalar(.Value(), .DataType()), nil
	case *array.Time64:
		return NewTime64Scalar(.Value(), .DataType()), nil
	case *array.Timestamp:
		return NewTimestampScalar(.Value(), .DataType()), nil
	case *array.RunEndEncoded:
		 := encoded.FindPhysicalIndex(.Data(), .Offset()+)
		,  := (.Values(), )
		if  != nil {
			return nil, 
		}

		return NewRunEndEncodedScalar(, .DataType().(*arrow.RunEndEncodedType)), nil
	case *array.Dictionary:
		 := .DataType().(*arrow.DictionaryType)
		 := .IsValid()
		 := &Dictionary{scalar: scalar{, }}
		if  {
			,  := MakeScalarParam(.GetValueIndex(), .IndexType)
			if  != nil {
				return nil, 
			}

			.Value.Index = 
		} else {
			.Value.Index = MakeNullScalar(.IndexType)
		}

		.Value.Dict = .Dictionary()
		.Value.Dict.Retain()
		return , nil
	case *array.SparseUnion:
		var  error
		 := .TypeCode()
		 := make([]Scalar, .NumFields())
		defer func() {
			if  != nil {
				for ,  := range  {
					if  == nil {
						break
					}

					if ,  := .(Releasable);  {
						.Release()
					}
				}
			}
		}()

		for  := range .UnionType().Fields() {
			if [],  = (.Field(), );  != nil {
				return nil, 
			}
		}
		return NewSparseUnionScalar(, , .UnionType().(*arrow.SparseUnionType)), nil
	case *array.DenseUnion:
		 := .TypeCode()
		 := .Field(.ChildID())
		 := .ValueOffset()
		,  := (, int())
		if  != nil {
			return nil, 
		}
		return NewDenseUnionScalar(, , .UnionType().(*arrow.DenseUnionType)), nil
	}

	return nil, fmt.Errorf("cannot create scalar from array of type %s", .DataType())
}

// MakeArrayOfNull creates an array of size length which is all null of the given data type.
//
// Deprecated: Use array.MakeArrayOfNull
func ( arrow.DataType,  int,  memory.Allocator) arrow.Array {
	var (
		  = []*memory.Buffer{nil}
		 []arrow.ArrayData
	)

	[0] = memory.NewResizableBuffer()
	[0].Resize(int(bitutil.BytesForBits(int64())))
	defer [0].Release()

	switch t := .(type) {
	case arrow.NestedType:
		 := .Fields()
		 = make([]arrow.ArrayData, len())
		for ,  := range  {
			 := (.Type, , )
			defer .Release()
			[] = .Data()
		}
	case arrow.FixedWidthDataType:
		 = append(, memory.NewResizableBuffer())
		[1].Resize(int(bitutil.BytesForBits(int64(.BitWidth()))) * )
		defer [1].Release()
	case arrow.BinaryDataType:
		 = append(, memory.NewResizableBuffer(), nil)
		[1].Resize(arrow.Int32Traits.BytesRequired( + 1))
		defer [1].Release()
	}

	 := array.NewData(, , , , , 0)
	defer .Release()
	return array.MakeFromData()
}

// MakeArrayFromScalar returns an array filled with the scalar value repeated length times.
// Not yet implemented for nested types such as Struct, List, extension and so on.
func ( Scalar,  int,  memory.Allocator) (arrow.Array, error) {
	if !.IsValid() {
		return MakeArrayOfNull(.DataType(), , ), nil
	}

	 := func( int32) *memory.Buffer {
		 := memory.NewResizableBuffer()
		.Resize(arrow.Int32Traits.BytesRequired( + 1))

		 := arrow.Int32Traits.CastFromBytes(.Bytes())
		for ,  := 0, int32(0);  < +1; ,  = +1, + {
			[] = 
		}
		return 
	}

	 := func( []byte) *memory.Buffer {
		 := memory.NewResizableBuffer()
		.Resize(len() * )

		 := .Bytes()
		copy(, )
		for  := len();  < len();  *= 2 {
			copy([:], [:])
		}
		return 
	}

	 := func( []byte) arrow.ArrayData {
		 := ()
		defer .Release()
		return array.NewData(.DataType(), , []*memory.Buffer{nil, }, nil, 0, 0)
	}

	switch s := .(type) {
	case *Boolean:
		 := memory.NewResizableBuffer()
		defer .Release()
		.Resize(int(bitutil.BytesForBits(int64())))
		 := byte(0x00)
		if .Value {
			 = 0xFF
		}
		memory.Set(.Bytes(), )
		return array.NewBoolean(, , nil, 0), nil
	case BinaryScalar:
		if .DataType().ID() == arrow.FIXED_SIZE_BINARY {
			 := (.Data())
			defer .Release()
			return array.MakeFromData(), nil
		}

		 := (.Data())
		 := (int32(len(.Data())))
		 := array.NewData(.DataType(), , []*memory.Buffer{nil, , }, nil, 0, 0)
		defer func() {
			.Release()
			.Release()
			.Release()
		}()
		return array.MakeFromData(), nil
	case *Decimal128:
		 := (arrow.Decimal128Traits.CastToBytes([]decimal128.Num{.Value}))
		defer .Release()
		return array.MakeFromData(), nil
	case *Decimal256:
		 := (arrow.Decimal256Traits.CastToBytes([]decimal256.Num{.Value}))
		defer .Release()
		return array.MakeFromData(), nil
	case PrimitiveScalar:
		 := (.Data())
		defer .Release()
		return array.MakeFromData(), nil
	case *List:
		 := make([]arrow.Array, )
		for  := range  {
			[] = .Value
		}

		,  := array.Concatenate(, )
		if  != nil {
			return nil, 
		}
		defer .Release()

		 := (int32(.Value.Len()))
		defer .Release()
		 := array.NewData(.DataType(), , []*memory.Buffer{nil, }, []arrow.ArrayData{.Data()}, 0, 0)
		defer .Release()
		return array.MakeFromData(), nil
	case *FixedSizeList:
		 := make([]arrow.Array, )
		for  := range  {
			[] = .Value
		}

		,  := array.Concatenate(, )
		if  != nil {
			return nil, 
		}
		defer .Release()

		 := array.NewData(.DataType(), , []*memory.Buffer{nil}, []arrow.ArrayData{.Data()}, 0, 0)
		defer .Release()
		return array.MakeFromData(), nil
	case *Struct:
		 := make([]arrow.ArrayData, 0)
		for ,  := range .Value {
			,  := (, , )
			if  != nil {
				return nil, 
			}
			defer .Release()
			 = append(, .Data())
		}

		 := array.NewData(.DataType(), , []*memory.Buffer{nil}, , 0, 0)
		defer .Release()
		return array.NewStructData(), nil
	case *Map:
		 := .GetList().(*array.Struct)
		 := make([]arrow.Array, )
		 := make([]arrow.Array, )
		for  := 0;  < ; ++ {
			[] = .Field(0)
			[] = .Field(1)
		}

		,  := array.Concatenate(, )
		if  != nil {
			return nil, 
		}
		defer .Release()

		,  := array.Concatenate(, )
		if  != nil {
			return nil, 
		}
		defer .Release()

		 := (int32(.Len()))
		 := array.NewData(.DataType(), .Len(), []*memory.Buffer{nil}, []arrow.ArrayData{.Data(), .Data()}, 0, 0)
		 := array.NewData(.DataType(), , []*memory.Buffer{nil, }, []arrow.ArrayData{}, 0, 0)
		defer func() {
			.Release()
			.Release()
			.Release()
		}()
		return array.MakeFromData(), nil
	case *RunEndEncoded:
		 := .DataType().(*arrow.RunEndEncodedType)

		var  []byte
		switch .RunEnds().ID() {
		case arrow.INT16:
			if  > math.MaxInt16 {
				return nil, fmt.Errorf("%w: length overflows int16 run ends", arrow.ErrInvalid)
			}

			 := int16()
			 = (*[2]byte)(unsafe.Pointer(&))[:]
		case arrow.INT32:
			if  > math.MaxInt32 {
				return nil, fmt.Errorf("%w: final length overflows int32 run ends", arrow.ErrInvalid)
			}

			 := int32()
			 = (*[4]byte)(unsafe.Pointer(&))[:]
		case arrow.INT64:
			 := int64()
			 = (*[8]byte)(unsafe.Pointer(&))[:]
		}

		 := ()
		defer .Release()

		,  := (.Value, 1, )
		if  != nil {
			return nil, 
		}
		defer .Release()

		 := array.NewData(.RunEnds(), 1, []*memory.Buffer{nil, }, nil, 0, 0)
		defer .Release()

		 := array.NewData(.DataType(), , []*memory.Buffer{nil},
			[]arrow.ArrayData{, .Data()}, 0, 0)
		defer .Release()
		return array.NewRunEndEncodedData(), nil
	default:
		return nil, fmt.Errorf("array from scalar not yet implemented for type %s", .DataType())
	}
}

func ( maphash.Seed,  Scalar) uint64 {
	var  maphash.Hash
	.SetSeed()
	binary.Write(&, endian.Native, arrow.HashType(, .DataType()))

	 := .Sum64()
	if !.IsValid() {
		return 
	}

	 := func() {
		 ^= .Sum64()
		.Reset()
	}

	 := func( interface{}) uint64 {
		switch v := .(type) {
		case int32:
			.Write((*[4]byte)(unsafe.Pointer(&))[:])
		case int64:
			.Write((*[8]byte)(unsafe.Pointer(&))[:])
		case arrow.Date32:
			binary.Write(&, endian.Native, uint32())
		case arrow.Time32:
			binary.Write(&, endian.Native, uint32())
		case arrow.MonthInterval:
			binary.Write(&, endian.Native, uint32())
		case arrow.Duration:
			binary.Write(&, endian.Native, uint64())
		case arrow.Date64:
			binary.Write(&, endian.Native, uint64())
		case arrow.Time64:
			binary.Write(&, endian.Native, uint64())
		case arrow.Timestamp:
			binary.Write(&, endian.Native, uint64())
		case float16.Num:
			binary.Write(&, endian.Native, .Uint16())
		case decimal128.Num:
			binary.Write(&, endian.Native, .LowBits())
			()
			binary.Write(&, endian.Native, uint64(.HighBits()))
		case decimal256.Num:
			 := .Array()
			binary.Write(&, endian.Native, [3])
			()
			binary.Write(&, endian.Native, [2])
			()
			binary.Write(&, endian.Native, [1])
			()
			binary.Write(&, endian.Native, [0])
		}
		()
		return 
	}

	.Reset()
	switch s := .(type) {
	case *Null:
	case *Extension:
		 ^= (, .Value)
	case *DayTimeInterval:
		return (.Value.Days) & (.Value.Milliseconds)
	case *MonthDayNanoInterval:
		return (.Value.Months) & (.Value.Days) & (.Value.Nanoseconds)
	case *SparseUnion:
		// typecode is ignored when comparing for equality, so don't hash it either
		 ^= (, .Value[.ChildID])
	case *DenseUnion:
		// typecode is ignored when comparing equality, so don't hash it either
		 ^= (, .Value)
	case *Dictionary:
		if .Value.Index.IsValid() {
			 ^= (, .Value.Index)
		}
	case *RunEndEncoded:
		return (, .Value)
	case PrimitiveScalar:
		.Write(.Data())
		()
	case TemporalScalar:
		return (.value())
	case ListScalar:
		array.Hash(&, .GetList().Data())
		()
	case *Struct:
		for ,  := range .Value {
			if .IsValid() {
				 ^= (, )
			}
		}
	}

	return 
}