On Mon, Oct 7, 2024 at 7:39 AM Michael Paquier <mich...@paquier.xyz> wrote: > GOod point, this is confusing. The point is that having only > stmt_location is not enough to detect where the element in the query > you want to track is because it only points at its start location in > the full query string. In an ideal world, what we should have is its > start and end, pass it down to pgss_store(), and store only this > subquery between the start and end positions in the stats entry. > Making that right through the parser may be challenging, though.
One of the issues is that we don't track the length in the parser, only location[1]. The only place we can have some information about the statement length (or at least, the location of the ';') is for multi statement query. On Mon, Oct 7, 2024 at 6:17 PM jian he <jian.universal...@gmail.com> wrote: > turns out UPDATE/DELETE/MERGE and other utilities stmt cannot have > arbitrary parenthesis with EXPLAIN. Yes, it is also possible to get the length of the Select statement within parenthesis through the parser by using the location of ')' for the select_no_parens. > the main gotcha is to add location information for the statement that > is being explained. I've found that there are other possible issues with not having the statement length and including the opening parenthesis won't be enough. On HEAD, we have the following: explain(verbose) SELECT 1, 2, 3\; explain SELECT 1, 2, 3, 4; SELECT toplevel, query FROM pg_stat_statements ORDER BY toplevel desc, query; toplevel | query ----------+----------------------------------------------------------------- t | SELECT pg_stat_statements_reset() IS NOT NULL AS t t | explain SELECT $1, $2, $3, $4 t | explain(verbose) SELECT $1, $2, $3 f | explain(verbose) SELECT $1, $2, $3; explain SELECT 1, 2, 3, 4; f | explain(verbose) SELECT 1, 2, 3; explain SELECT $1, $2, $3, $4; The nested statement will have the whole query string. To fix this, we need to propagate the statement length from the RawStmt (probably using the ParserState?) and adjust the nested query's location and length when the statement is transformed. I'm still working on the details and edge cases on this. [1]: https://github.com/postgres/postgres/blob/REL_17_STABLE/src/backend/parser/gram.y#L69-L79