postgresql-jdbc.git / summary / log / commit / refs

commit    ee6118ee7ae18cd05fbbe340ee8cfa80ca120154
Author:   Vladimir Sitnikov <sitnikov.vladimir@gmail.com>
Date:     Sun Feb 07 15:25:53 2016 +0000

    doc: backend protocol, wanted features
    
    closes #478


README.md | 2 + backend_protocol_v4_wanted_features.md | 80 ++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/README.md b/README.md index adb890cc..8c414417 100644 --- a/README.md +++ b/README.md @@ -323,6 +323,8 @@ For more information see the [the PgJDBC driver documentation](http://jdbc.postg PgJDBC development is carried out on the [PgJDBC mailing list](https://jdbc.postgresql.org/community/mailinglist.html) and on [GitHub](https://github.com/pgjdbc/pgjdbc). +Set of "backend protocol missing features" is collected in [backend_protocol_v4_wanted_features.md](backend_protocol_v4_wanted_features.md) + ### Bug reports For bug reports please post on pgsql-jdbc or add a GitHub issue. If you include diff --git a/backend_protocol_v4_wanted_features.md b/backend_protocol_v4_wanted_features.md new file mode 100644 index 00000000..895dcb55 --- /dev/null +++ b/backend_protocol_v4_wanted_features.md @@ -0,0 +1,80 @@ +# PostgreSQL backend protocol: wanted features + +Current protocol is documented here: http://www.postgresql.org/docs/9.4/static/protocol.html + +It turns out it lacks certain features, thus it makes clients more complex, slower, etc. + +Here's the list of features that often appear in discussions. + +## Features + +### Binary transfer vs exact data type + +Current protocol supports text and binary transfer. +It turns out in text mode backend does not need to know the exact data type. In most cases it can +easily deduce the data type. Binary mode is typically faster, however when consuming binary, +backend assumes the data type is exact and it does not consider casts. + +It would be nice to have an ability to pass a value in binary form (for efficiency) yet +make backend deduce proper data type for it. + + +Kevin Wooten: my biggest request is always to treat binary types as if the client “just knows” how +to handle them. There are numerous cases with the text format where the server will coerce columns +to the most correct type and it will not do this for binary requests; it just spits out a complaint +that you’ve got the wrong type. + +That, and being able to switch to “prefer binary” mode in the protocol. So when I make an non-bound +request I can get the results back in binary. Currently you can only get them in text format. +This has a couple of implications. First, speed, you always have to bind before querying to get +binary results. Second is multiple SQL statements in a single request, which you +cannot do in bound requests. + +### Non-trivial semantics of numerics in text mode + +In text mode, numerics and money types are transferred with unknown decimal separator. +This makes it hard to decode the value as it is locale-dependent. + +See: https://github.com/pgjdbc/pgjdbc/pull/439 + +### Lack of `prepared statement invalidated` messages from backend + +Server-prepared statement might become invalid due to table structure change, column type change, +etc. +It results in "your prepared statement is no longer valid". This is no fun. + +See: https://github.com/pgjdbc/pgjdbc/pull/451 + +## Brain dumps + +### Álvaro Hernández + +- Uniform headers (type byte). Some messages (startup, ssl, etc) don't have the type byte marker. +This is annoying. +- Byte type re-use. The type byte is re-used across senders and receivers. It is unambiguous, +but it is still very weird. +- Query pipelining. There has been much discussion about it. I don't have a clear conclusion other +than it's somehow possible, but requires driver support (keep track of sent/received messages +and errors). This could be easily handled with protocol support, like using a unique id for every +message and including in the reply that id. +- Cluster support. Real production environments are clusters (sets of PostgreSQL servers +using any kind of replication). Protocol should be concerned with this, specially if some HA +mechanisms are built into the protocol. +- Server metadata without authentication. Some messages should be able to be exchanged +to get information about servers (like version, read/write state and probably others) without +having to authenticate and involve in lengthy processes. +- No out-of-band messages (like query cancellation) +- Simplified design (current is too complex and with too many messages) +- Specified in a formal syntax (I mean not English, a formal language for specifying it) and +with a TCK (Test Compatibility Kit) +- Allow some controlled form of protocol extensibility +- A back-pressure method for query results +- All the "usual suspects": support for binary format, partial query results, +large objects and so on + +### Vladimir Sitnikov + +- compressed streams over network +- "query response status" messages being sent in plain text (`insert 1`, `select 10`, etc.). +Having some binary there would make things easier to parse. +- unable to use prepared statements for `set "application_name"=...`, etc [parent: b225535640b7]