From 808ea8fc7bb259ddd810353719cac66e85a608c8 Mon Sep 17 00:00:00 2001 From: Joe Conway Date: Sat, 11 Jul 2015 14:19:31 -0700 Subject: [PATCH] Add assign_expr_collations() to CreatePolicy() and AlterPolicy(). As noted by Noah Misch, CreatePolicy() and AlterPolicy() omit to call assign_expr_collations() on the node trees. Fix the omission and add his test case to the rowsecurity regression test. --- src/backend/commands/policy.c | 10 ++++++++++ src/test/regress/expected/rowsecurity.out | 21 +++++++++++++++++++++ src/test/regress/sql/rowsecurity.sql | 12 ++++++++++++ 3 files changed, 43 insertions(+) diff --git a/src/backend/commands/policy.c b/src/backend/commands/policy.c index 11efc9f30f..72329834a3 100644 --- a/src/backend/commands/policy.c +++ b/src/backend/commands/policy.c @@ -538,6 +538,10 @@ CreatePolicy(CreatePolicyStmt *stmt) EXPR_KIND_WHERE, "POLICY"); + /* Fix up collation information */ + assign_expr_collations(qual_pstate, qual); + assign_expr_collations(with_check_pstate, with_check_qual); + /* Open pg_policy catalog */ pg_policy_rel = heap_open(PolicyRelationId, RowExclusiveLock); @@ -681,6 +685,9 @@ AlterPolicy(AlterPolicyStmt *stmt) EXPR_KIND_WHERE, "POLICY"); + /* Fix up collation information */ + assign_expr_collations(qual_pstate, qual); + qual_parse_rtable = qual_pstate->p_rtable; free_parsestate(qual_pstate); } @@ -701,6 +708,9 @@ AlterPolicy(AlterPolicyStmt *stmt) EXPR_KIND_WHERE, "POLICY"); + /* Fix up collation information */ + assign_expr_collations(with_check_pstate, with_check_qual); + with_check_parse_rtable = with_check_pstate->p_rtable; free_parsestate(with_check_pstate); } diff --git a/src/test/regress/expected/rowsecurity.out b/src/test/regress/expected/rowsecurity.out index 4073c1beea..eabfd932de 100644 --- a/src/test/regress/expected/rowsecurity.out +++ b/src/test/regress/expected/rowsecurity.out @@ -2730,6 +2730,27 @@ ERROR: permission denied for relation copy_t RESET SESSION AUTHORIZATION; DROP TABLE copy_t; -- +-- Collation support +-- +BEGIN; +SET row_security = force; +CREATE TABLE coll_t (c) AS VALUES ('bar'::text); +CREATE POLICY coll_p ON coll_t USING (c < ('foo'::text COLLATE "C")); +ALTER TABLE coll_t ENABLE ROW LEVEL SECURITY; +SELECT (string_to_array(polqual, ':'))[7] AS inputcollid FROM pg_policy WHERE polrelid = 'coll_t'::regclass; + inputcollid +------------------ + inputcollid 950 +(1 row) + +SELECT * FROM coll_t; + c +----- + bar +(1 row) + +ROLLBACK; +-- -- Clean up objects -- RESET SESSION AUTHORIZATION; diff --git a/src/test/regress/sql/rowsecurity.sql b/src/test/regress/sql/rowsecurity.sql index fdd9b892ce..782824acfd 100644 --- a/src/test/regress/sql/rowsecurity.sql +++ b/src/test/regress/sql/rowsecurity.sql @@ -1087,6 +1087,18 @@ COPY copy_t FROM STDIN; --fail - permission denied. RESET SESSION AUTHORIZATION; DROP TABLE copy_t; +-- +-- Collation support +-- +BEGIN; +SET row_security = force; +CREATE TABLE coll_t (c) AS VALUES ('bar'::text); +CREATE POLICY coll_p ON coll_t USING (c < ('foo'::text COLLATE "C")); +ALTER TABLE coll_t ENABLE ROW LEVEL SECURITY; +SELECT (string_to_array(polqual, ':'))[7] AS inputcollid FROM pg_policy WHERE polrelid = 'coll_t'::regclass; +SELECT * FROM coll_t; +ROLLBACK; + -- -- Clean up objects -- -- 2.40.0