maplibre/martin

Allow overloaded functions (name+param combinations)

开放

#803 创建于 2023年8月13日

 (0 条评论) (0 个反应) (0 位负责人)Rust (377 个派生)auto 404
confighelp wantedpgrust

仓库指标

星标
 (3,761 个星标)
PR 合并指标
 (平均合并 2天 16小时) (30 天内合并 78 个 PR)

描述

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).

贡献者指南