maplibre/martin

Allow overloaded functions (name+param combinations)

Open

#803 opened on Aug 13, 2023

 (0 comments) (0 reactions) (0 assignees)Rust (377 forks)auto 404
confighelp wantedpgrust

Repository metrics

Stars
 (3,761 stars)
PR merge metrics
 (PR metrics pending)

Description

PR https://github.com/maplibre/martin/pull/543 adds a few more unit tests:

"MixedCase".function_dup(int, int, int)
"MixedCase"."function_Dup"(int, int, int)
"MixedCase".function_dup(int, int, int, json)
"MixedCase".function_dup(int, int, int, jsonb)

Martin should be able to create these with de-duplicated names, e.g. function_dup.1, function_dup.2, etc.

Implementation notes

  • The complex part is that configuration must be able to support multiple argument types. Config spec may need to be expanded, and we would need to support function argument parsing. Parsing should also do some basic PostgeSQL type normalization like int -> int4 and bigint -> int8
postgres:
  functions:
    function_source_id:
      schema: "public"
      # Idea 1: more ergonomic, but harder to implement:
      function: "function_zxy_query(int4, int4, int4)"
      # Idea 2: less ergonomic but simpler
      function: function_zxy_query
      args: ["int4", "int4", "int4"]
  • fn query_available_function(...) -> InfoMap<InfoMap<(PgSqlInfo, FunctionInfo)>>, which is a HashMap<String, HashMap<String, (PgSqlInfo, FunctionInfo)>> - in other words a map of schema name to a map of function name (unique) to all the data about the given function. In order to support multiple names, it would have to be changed to something like this: InfoMap<InfoMap<HashMap<Vec<String>, (PgSqlInfo, FunctionInfo)>>> (list of arguments is used as a key to arguments).

Contributor guide