Correctly producing array literals for prepared statements

Поиск
Список
Период
Сортировка
От Peter Geoghegan
Тема Correctly producing array literals for prepared statements
Дата
Msg-id AANLkTiktDh-qOW-Tn68SrP3E99yvHg++kxyTwM8Kk8e_@mail.gmail.com
обсуждение исходный текст
Ответы Re: Correctly producing array literals for prepared statements  (Greg Stark <gsstark@mit.edu>)
Re: Correctly producing array literals for prepared statements  (Merlin Moncure <mmoncure@gmail.com>)
Список pgsql-hackers
I'm investigating the possibility of developing a utility function for
our C++ client library, libpqxx, that produces array literals that can
be used in prepared statements. This problem appears to be a bit of a
tar pit, so I'm hoping that someone can help me out. My goal is to
produce a template function that accepts arbitrarily nested standard
library containers, that contain at the most nested level
constants/literals of some type that can be fed into a stream, such as
an int or a std::string.

I'm aware that I cannot assume that types are delimited by a single
quote, even for built-in types. I thought that I would put the onus on
the client to specify the correct delimiter, by checking pg_type
themselves if necessary, but default to ',' . Is this a reasonable
approach?

Escaping/quoting individual elements seems tricky. I have produced a
generic and superficially well behaved implementation by using double
quotes for constants. However, I have now opened the door to malicious
parties injecting multiple array elements where only one is allowed,
or causing malformed array literal errors by simply including a double
quote of their own. It's not clear where the responsibility should
rest for escaping constants/ensuring that constants don't contain
double quotes. Can someone suggest a better approach? I can't very
well use single quotes, because they are escaped/doubled up when we
pass the array literal to something similar to PQexecPrepared(), and
they shouldn't be - strings end up looking like this: "'has errant
single quotes on either side'".

Since Postgres only supports encodings that are ASCII supersets, I
don't believe that I have to consider encoding - only my clients do.

Can someone please point me in the direction of an established client
library/driver where all corner cases are covered, or at least enough
of them to produce a net gain in usefulness? There may well be
additional subtleties that have not occurred to me.

-- 
Regards,
Peter Geoghegan


В списке pgsql-hackers по дате отправления:

Предыдущее
От: Josh Berkus
Дата:
Сообщение: Re: TODO: You can alter it, but you can't view it
Следующее
От: Greg Stark
Дата:
Сообщение: Re: Correctly producing array literals for prepared statements