class DuckDB::ScalarFunction

@note DuckDB::ScalarFunction is experimental.
DuckDB::ScalarFunction encapsulates DuckDB’s scalar function

def self.create( # rubocop:disable Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity,Metrics/ParameterLists

Other tags:
    Example: NULL-aware function (block receives nil for NULL inputs) -
    Example: No parameters (constant function) -
    Example: Fixed parameter(s) followed by varargs -
    Example: Varargs function (variable number of arguments) -
    Example: Multiple parameters -
    Example: Single parameter function -

Raises:
  • (ArgumentError) - if block is not provided, or both parameter_type and parameter_types are specified

Returns:
  • (DuckDB::ScalarFunction) - configured scalar function ready to register

Other tags:
    Yield: - the function implementation

Parameters:
  • null_handling (Boolean) -- when +true+, calls +set_special_handling+ so the block
  • varargs_type (DuckDB::LogicalType|:logical_type_symbol, nil) -- trailing varargs element type;
  • parameter_types (Array, nil) -- multiple fixed parameter types
  • parameter_type (DuckDB::LogicalType|:logical_type_symbol, nil) -- single fixed parameter type
  • return_type (DuckDB::LogicalType|:logical_type_symbol) -- the return type
  • name (String, Symbol, nil) -- the function name; use +nil+ when creating overloads
def self.create( # rubocop:disable Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity,Metrics/ParameterLists
  return_type:, name: nil, parameter_type: nil, parameter_types: nil, varargs_type: nil, null_handling: false, &
)
  raise ArgumentError, 'Block required' unless block_given?
  raise ArgumentError, 'Cannot specify both parameter_type and parameter_types' if parameter_type && parameter_types
  params = if parameter_type
             [parameter_type]
           elsif parameter_types
             parameter_types
           else
             []
           end
  sf = new
  sf.name = name.to_s if name
  sf.return_type = return_type
  params.each { |type| sf.add_parameter(type) }
  sf.varargs_type = varargs_type if varargs_type
  sf.set_special_handling if null_handling
  sf.set_function(&)
  sf
end

def add_parameter(logical_type)

Raises:
  • (DuckDB::Error) - if the type is not supported

Returns:
  • (DuckDB::ScalarFunction) - self

Parameters:
  • logical_type (DuckDB::LogicalType | :logical_type_symbol) -- the parameter type
def add_parameter(logical_type)
  logical_type = check_supported_type!(logical_type)
  _add_parameter(logical_type)
end

def return_type=(logical_type)

Raises:
  • (DuckDB::Error) - if the type is not supported

Returns:
  • (DuckDB::ScalarFunction) - self

Parameters:
  • logical_type (DuckDB::LogicalType | :logical_type_symbol) -- the return type
def return_type=(logical_type)
  logical_type = check_supported_type!(logical_type)
  _set_return_type(logical_type)
end

def set_bind(&block)

Other tags:
    Example: Validate argument count at planning time -

Raises:
  • (ArgumentError) - if no block is given

Returns:
  • (DuckDB::ScalarFunction) - self

Other tags:
    Yieldparam: bind_info -

Other tags:
    Yield: - called at planning time with a BindInfo object
def set_bind(&block)
  raise ArgumentError, 'block is required' unless block
  _set_bind(&block)
end

def set_special_handling

Returns:
  • (DuckDB::ScalarFunction) - self
def set_special_handling
  _set_special_handling
end

def varargs_type=(logical_type)

Raises:
  • (DuckDB::Error) - if the type is not supported

Returns:
  • (DuckDB::ScalarFunction) - self

Parameters:
  • logical_type (DuckDB::LogicalType | :logical_type_symbol) -- the varargs element type
def varargs_type=(logical_type)
  logical_type = check_supported_type!(logical_type)
  _set_varargs(logical_type)
end