diff options
| -rw-r--r-- | src/backend/commands/policy.c | 10 | ||||
| -rw-r--r-- | src/test/regress/expected/rowsecurity.out | 21 | ||||
| -rw-r--r-- | src/test/regress/sql/rowsecurity.sql | 12 | 
3 files changed, 43 insertions, 0 deletions
diff --git a/src/backend/commands/policy.c b/src/backend/commands/policy.c index 11efc9f30f1..72329834a31 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 4073c1beea5..eabfd932de9 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 fdd9b892ce6..782824acfda 100644 --- a/src/test/regress/sql/rowsecurity.sql +++ b/src/test/regress/sql/rowsecurity.sql @@ -1088,6 +1088,18 @@ 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  --  RESET SESSION AUTHORIZATION;  | 
