mirror of
https://github.com/postgres/postgres.git
synced 2025-06-08 22:02:03 +03:00
Fix deparsing FETCH FIRST <expr> ROWS WITH TIES
In the grammar, <expr> is a c_expr, which accepts only a limited set of integer literals and simple expressions without parens. The deparsing logic didn't quite match the grammar rule, and failed to use parens e.g. for "5::bigint". To fix, always surround the expression with parens. Would be nice to omit the parens in simple cases, but unfortunately it's non-trivial to detect such simple cases. Even if the expression is a simple literal 123 in the original query, after parse analysis it becomes a FuncExpr with COERCE_IMPLICIT_CAST rather than a simple Const. Reported-by: yonghao lee Backpatch-through: 13 Discussion: https://www.postgresql.org/message-id/18929-077d6b7093b176e2@postgresql.org
This commit is contained in:
parent
ad5eaf390c
commit
29f7ce6fe7
@ -5956,9 +5956,19 @@ get_select_query_def(Query *query, deparse_context *context)
|
|||||||
{
|
{
|
||||||
if (query->limitOption == LIMIT_OPTION_WITH_TIES)
|
if (query->limitOption == LIMIT_OPTION_WITH_TIES)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* The limitCount arg is a c_expr, so it needs parens. Simple
|
||||||
|
* literals and function expressions would not need parens, but
|
||||||
|
* unfortunately it's hard to tell if the expression will be
|
||||||
|
* printed as a simple literal like 123 or as a typecast
|
||||||
|
* expression, like '-123'::int4. The grammar accepts the former
|
||||||
|
* without quoting, but not the latter.
|
||||||
|
*/
|
||||||
appendContextKeyword(context, " FETCH FIRST ",
|
appendContextKeyword(context, " FETCH FIRST ",
|
||||||
-PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
|
-PRETTYINDENT_STD, PRETTYINDENT_STD, 0);
|
||||||
|
appendStringInfoChar(buf, '(');
|
||||||
get_rule_expr(query->limitCount, context, false);
|
get_rule_expr(query->limitCount, context, false);
|
||||||
|
appendStringInfoChar(buf, ')');
|
||||||
appendStringInfoString(buf, " ROWS WITH TIES");
|
appendStringInfoString(buf, " ROWS WITH TIES");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -647,7 +647,7 @@ View definition:
|
|||||||
WHERE thousand < 995
|
WHERE thousand < 995
|
||||||
ORDER BY thousand
|
ORDER BY thousand
|
||||||
OFFSET 10
|
OFFSET 10
|
||||||
FETCH FIRST 5 ROWS WITH TIES;
|
FETCH FIRST (5) ROWS WITH TIES;
|
||||||
|
|
||||||
CREATE VIEW limit_thousand_v_2 AS SELECT thousand FROM onek WHERE thousand < 995
|
CREATE VIEW limit_thousand_v_2 AS SELECT thousand FROM onek WHERE thousand < 995
|
||||||
ORDER BY thousand OFFSET 10 FETCH FIRST 5 ROWS ONLY;
|
ORDER BY thousand OFFSET 10 FETCH FIRST 5 ROWS ONLY;
|
||||||
@ -679,15 +679,29 @@ View definition:
|
|||||||
FROM onek
|
FROM onek
|
||||||
WHERE thousand < 995
|
WHERE thousand < 995
|
||||||
ORDER BY thousand
|
ORDER BY thousand
|
||||||
FETCH FIRST (NULL::integer + 1) ROWS WITH TIES;
|
FETCH FIRST ((NULL::integer + 1)) ROWS WITH TIES;
|
||||||
|
|
||||||
CREATE VIEW limit_thousand_v_4 AS SELECT thousand FROM onek WHERE thousand < 995
|
CREATE VIEW limit_thousand_v_4 AS SELECT thousand FROM onek WHERE thousand < 995
|
||||||
ORDER BY thousand FETCH FIRST NULL ROWS ONLY;
|
ORDER BY thousand FETCH FIRST (5::bigint) ROWS WITH TIES;
|
||||||
\d+ limit_thousand_v_4
|
\d+ limit_thousand_v_4
|
||||||
View "public.limit_thousand_v_4"
|
View "public.limit_thousand_v_4"
|
||||||
Column | Type | Collation | Nullable | Default | Storage | Description
|
Column | Type | Collation | Nullable | Default | Storage | Description
|
||||||
----------+---------+-----------+----------+---------+---------+-------------
|
----------+---------+-----------+----------+---------+---------+-------------
|
||||||
thousand | integer | | | | plain |
|
thousand | integer | | | | plain |
|
||||||
|
View definition:
|
||||||
|
SELECT thousand
|
||||||
|
FROM onek
|
||||||
|
WHERE thousand < 995
|
||||||
|
ORDER BY thousand
|
||||||
|
FETCH FIRST (5::bigint) ROWS WITH TIES;
|
||||||
|
|
||||||
|
CREATE VIEW limit_thousand_v_5 AS SELECT thousand FROM onek WHERE thousand < 995
|
||||||
|
ORDER BY thousand FETCH FIRST NULL ROWS ONLY;
|
||||||
|
\d+ limit_thousand_v_5
|
||||||
|
View "public.limit_thousand_v_5"
|
||||||
|
Column | Type | Collation | Nullable | Default | Storage | Description
|
||||||
|
----------+---------+-----------+----------+---------+---------+-------------
|
||||||
|
thousand | integer | | | | plain |
|
||||||
View definition:
|
View definition:
|
||||||
SELECT thousand
|
SELECT thousand
|
||||||
FROM onek
|
FROM onek
|
||||||
|
@ -196,6 +196,9 @@ CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995
|
|||||||
ORDER BY thousand FETCH FIRST (NULL+1) ROWS WITH TIES;
|
ORDER BY thousand FETCH FIRST (NULL+1) ROWS WITH TIES;
|
||||||
\d+ limit_thousand_v_3
|
\d+ limit_thousand_v_3
|
||||||
CREATE VIEW limit_thousand_v_4 AS SELECT thousand FROM onek WHERE thousand < 995
|
CREATE VIEW limit_thousand_v_4 AS SELECT thousand FROM onek WHERE thousand < 995
|
||||||
ORDER BY thousand FETCH FIRST NULL ROWS ONLY;
|
ORDER BY thousand FETCH FIRST (5::bigint) ROWS WITH TIES;
|
||||||
\d+ limit_thousand_v_4
|
\d+ limit_thousand_v_4
|
||||||
|
CREATE VIEW limit_thousand_v_5 AS SELECT thousand FROM onek WHERE thousand < 995
|
||||||
|
ORDER BY thousand FETCH FIRST NULL ROWS ONLY;
|
||||||
|
\d+ limit_thousand_v_5
|
||||||
-- leave these views
|
-- leave these views
|
||||||
|
Loading…
x
Reference in New Issue
Block a user