get-connection's URI conventions incompatible with PostgreSQL
Description
Environment
Activity

Sean Corfield August 1, 2012 at 1:46 AM
Glad you got to the bottom of it and confirmed that it wasn't a problem in java.jdbc!

import August 1, 2012 at 1:20 AM
Comment made by: holo
Sean, JDBC combinations were working after. i was neglecting an insert operation in a table with a reserved sql keyword "user", so i was getting a "ERROR: syntax error at or near "user" Position: 13", and therefore the connection was already established at the time.
i'm sorry for all the trouble answering the question (_
thank you

import July 30, 2012 at 2:36 AM
Comment made by: holo
Sean, thank you for such comprehensive explanation.
Still, it didn't work with any of the options. I used before a postgres JDBC driver to export to the same database (in an SQL modeller - SQLEditor for the MAC) and it worked (though it would connect some times, but others not). The connection String used was like "jdbcostgresql://hostort/database?user=xxx&password=yyy&ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory". The driver name was "org.postgresql.Driver" (JDBC4). Anyway, time to give up. I will just use a local database.
Thank you!

Sean Corfield July 29, 2012 at 10:57 PM
Carlos, the :connection-uri passes the string directly to the driver with no parsing. The exception you're seeing is coming from inside the PostgreSQL driver so you'll have to consult the documentation for the driver.
The three "URI" styles accepted by java.jdbc are:
:connection-uri - passed directly to the driver with no parsing or other logic in java.jdbc,
:uri - a pre-parsed Java URI object,
a string literal - any optional "jdbc:" prefix is ignored, then the string is parsed by logic in java.jdbc, based on the pattern shown (subprotocol://userassword@hostort/subname).
If you're using :connection-uri (which is used on its own), you're dealing with the JDBC driver directly.
If you're using :uri or a bare string literal, you're dealing with java.jdbc's parsing (implemented by Phil Hagelberg - of Heroku).
Hope that clarifies?

import July 29, 2012 at 2:09 AM
Comment made by: holo
accessing an heroku database outside heroku, "sslfactory=org.postgresql.ssl.NonValidatingFactory" doesn't work. i get "ERROR: syntax error at or near "user" Position: 13 - (class org.postgresql.util.PSQLException". this happens whether adding it to :subname or :connection-uri Strings
another minor issue - why the documentation of "with-connection" (0.2.3) refers the following format for the connection string URI:
"subprotocol://userassword@hostost/subname
An optional prefix of jdbc: is allowed."
but the URI which can actually be parsed successfully is like the one above: jdbcostgresql://ec2-22-11-231-117.compute-1.amazonaws.com:5432/d1kuttup5cbafl6?user=pcgoxvmssqabye&password=PFZXtxaLFhIX-nCA0Vi4UbJ6lH&ssl=true
"subprotocol://userassword@hostost/subname" (format like the DATABASE environment variables on heroku) will not be parsed correctly. why the format for the URI that is used on heroku is not supported by the parser?
maybe i'm doing something wrong here
thanks in advance
Details
Assignee
Sean CorfieldSean CorfieldReporter
Chas EmerickChas EmerickPriority
Major
Details
Details
Assignee

Reporter

Priority

get-connection
requires that provided URIs be structured like so:This is often sufficient, but many PostgreSQL URIs require the use of URI parameters to further configure connections. For example, postgresql.heroku.com provides JDBC URIs like this:
...which, when used outside of Heroku's network, require a further
sslfactory=org.postgresql.ssl.NonValidatingFactory
parameter.The PostgreSQL JDBC driver supports a number of different URI parameters, and recommends putting credentials into parameters rather than using the
user
assword@
convention. Peeking over at the Oracle thin JDBC driver's docs, it appears that it expects credentials using its own idiosyncratic convention,user/password@
.<opinion>
This all leads me to think that
get-connection
should pass URIs along toDriverManager
without modification, and leave URI format conventions up to the drivers involved. For now, my workaround is to do essentially that, using a map like this as input towith-connection
et al.:That certainly works, but I presume that such a workaround won't occur to many users, despite the docs/source.
</opinion>
I don't think I've used java.jdbc enough (or RDMBS' enough of late) to comfortably provide a patch (or feel particularly confident in the suggestion above). Hopefully the report is helpful in any case.