Re: Cleaning up PREPARE query strings?
| От | Julien Rouhaud |
|---|---|
| Тема | Re: Cleaning up PREPARE query strings? |
| Дата | |
| Msg-id | aWNWO8wEvu6YQaKN@jrouhaud обсуждение исходный текст |
| Ответ на | Re: Cleaning up PREPARE query strings? (Tom Lane <tgl@sss.pgh.pa.us>) |
| Список | pgsql-hackers |
Hi, On Wed, Dec 24, 2025 at 11:21:00AM -0500, Tom Lane wrote: > Julien Rouhaud <rjuju123@gmail.com> writes: > > I'm attaching a POC patch to fix that behavior by teaching PREPARE to clean the > > passed query text the same way as pg_stat_statements. > > This patch invalidates all the location fields in the parsed query: > they could not be used to generate sane error cursors referencing the > truncated string. I'm not sure how many places try to generate such > errors post-parsing, but it's more than zero, and I've long had > ambitions of trying to extend that substantially (e.g, allowing > execution-time errors from functions to point at the relevant function > call). Ah I wasn't aware of that. After a quick look I'm assuming it's all the callers of executor_errposition()? There aren't a lot of them, and I've unfortunately been unable to hit any of them. Every scenario I tried was always caught during planning time. Do you have any example on how to exercise them? > Certainly the patch could be extended to update all those fields, > but that increases its complexity very significantly. I doubt > that it's worth it. My reaction to your example is more like > "if that bothers you, don't do it that way". I agree that updating the location fields in the whole parsetree is a non starter, butt I don't think that it's the only option. If that's indeed the cases going through executor_errposition(), they rely on having the executor state at hand to retrieve the query string. We could simply have an extra "query string offset" field stored there that would always be 0 except when PREPARE changes the input query string and then do the location to character number calculation after applying that offset. And that offset should already be returned by CleanQuerytext() so it wouldn't have extra complication.
В списке pgsql-hackers по дате отправления: