On Mon, Oct 26, 2015 at 4:25 PM, Peter Eisentraut <pete...@gmx.net> wrote: > On 10/14/15 6:41 AM, Victor Wagner wrote: >> 1. It is allowed to specify several hosts in the connect string, either >> in URL-style (separated by comma) or in param=value form (several host >> parameters). > > I'm not fond of having URLs that are not valid URLs according to the > applicable standards. Because then they can't be parsed or composed by > standard libraries.
I did a little bit more research on this topic and found out a few things that are interesting, at least to me. First, our documentation reference RFC3986. According to RFC3986: URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty authority = [ userinfo "@" ] host [ ":" port ] host = IP-literal / IPv4address / reg-name reg-name = *( unreserved / pct-encoded / sub-delims ) sub-delims include comma but not colon, so I think that postgresql://host1,host2,host3/ is a perfectly good URL, and so is postgresql://host1,host2,host3:1111/ but postgresql://host1:1234,host2:3456/ is not a valid URL because the : after host1 terminates the "host" portion of the URL. The port can't contain anything but digits, so 1234 has to be the port, but then there's nothing to do with the portion between the comma and the following slash, so it is indeed an invalid URI as far as I can tell. However, PostgreSQL's JDBC driver isn't alone in supporting something like this. The MySQL JDBC driver does the same thing: http://lists.mysql.com/cluster/249 https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html MongoDB refers to their connection string as a URI, but it uses exactly this syntax: https://docs.mongodb.com/manual/reference/connection-string/ Couchbase's syntax is also quite similar, though it's not clear that they allow port numbers: http://developer.couchbase.com/documentation/server/4.1/developer-guide/connecting.html Of course, since this is a very common need and it's not obvious how to satisfy it within the confines of the URI specification, people have developed a variety of other answers, such as (a) multiple URIs separated by commas, which is a terrible idea because comma can occur *within* URIs, (b) separating multiple host names with a double-dash, (c) including a parameter in the "query" portion of the URI to specify alternate host names, (d) defining a new failover: URI scheme that acts as a container for multiple connection URIs of whatever form is normally supported, and in the case of Oracle (e) creating some frightening monstrosity of proprietary syntax that I don't (care to) understand. All in all, I'm still feeling pretty good about trying to support the same syntax that our JDBC driver already does. It's certainly not a perfect solution, but it is at least compatible with MySQL's JDBC driver and with MongoDB, and in a world where everybody has picked a different approach that's not too bad. Hey, maybe if we use the same syntax as MongoDB they'll let us hang out with the cool kids... -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company -- Sent via pgsql-hackers mailing list (email@example.com) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers