pgsql: Fix ruleutils.c's dumping of ScalarArrayOpExpr containing an EXP
От | Tom Lane |
---|---|
Тема | pgsql: Fix ruleutils.c's dumping of ScalarArrayOpExpr containing an EXP |
Дата | |
Msg-id | E1atJDW-0006H9-KE@gemulon.postgresql.org обсуждение исходный текст |
Список | pgsql-committers |
Fix ruleutils.c's dumping of ScalarArrayOpExpr containing an EXPR_SUBLINK. When we shoehorned "x op ANY (array)" into the SQL syntax, we created a fundamental ambiguity as to the proper treatment of a sub-SELECT on the righthand side: perhaps what's meant is to compare x against each row of the sub-SELECT's result, or perhaps the sub-SELECT is meant as a scalar sub-SELECT that delivers a single array value whose members should be compared against x. The grammar resolves it as the former case whenever the RHS is a select_with_parens, making the latter case hard to reach --- but you can get at it, with tricks such as attaching a no-op cast to the sub-SELECT. Parse analysis would throw away the no-op cast, leaving a parsetree with an EXPR_SUBLINK SubLink directly under a ScalarArrayOpExpr. ruleutils.c was not clued in on this fine point, and would naively emit "x op ANY ((SELECT ...))", which would be parsed as the first alternative, typically leading to errors like "operator does not exist: text = text[]" during dump/reload of a view or rule containing such a construct. To fix, emit a no-op cast when dumping such a parsetree. This might well be exactly what the user wrote to get the construct accepted in the first place; and even if she got there with some other dodge, it is a valid representation of the parsetree. Per report from Karl Czajkowski. He mentioned only a case involving RLS policies, but actually the problem is very old, so back-patch to all supported branches. Report: <20160421001832.GB7976@moraine.isi.edu> Branch ------ REL9_4_STABLE Details ------- http://git.postgresql.org/pg/commitdiff/679c92238c74ed6c96e4251d7ea68f8a096ff674 Modified Files -------------- src/backend/utils/adt/ruleutils.c | 18 ++++++++++++++++++ src/test/regress/expected/create_view.out | 28 ++++++++++++++++++++++++++++ src/test/regress/sql/create_view.sql | 11 +++++++++++ 3 files changed, 57 insertions(+)
В списке pgsql-committers по дате отправления: