mirror of
https://github.com/postgres/postgres.git
synced 2025-06-13 07:41:39 +03:00
Revert MERGE patch
This reverts commitsd204ef6377
,83454e3c2b
and a few more commits thereafter (complete list at the end) related to MERGE feature. While the feature was fully functional, with sufficient test coverage and necessary documentation, it was felt that some parts of the executor and parse-analyzer can use a different design and it wasn't possible to do that in the available time. So it was decided to revert the patch for PG11 and retry again in the future. Thanks again to all reviewers and bug reporters. List of commits reverted, in reverse chronological order:f1464c5380
Improve parse representation for MERGEddb4158579
MERGE syntax diagram correction530e69e59b
Allow cpluspluscheck to pass by renaming variable01b88b4df5
MERGE minor errata3af7b2b0d4
MERGE fix variable warning in non-assert buildsa5d86181ec
MERGE INSERT allows only one VALUES clause4b2d44031f
MERGE post-commit review4923550c20
Tab completion for MERGEaa3faa3c7a
WITH support in MERGE83454e3c2b
New files for MERGEd204ef6377
MERGE SQL Command following SQL:2016 Author: Pavan Deolasee Reviewed-by: Michael Paquier
This commit is contained in:
@ -379,95 +379,6 @@ get_row_security_policies(Query *root, RangeTblEntry *rte, int rt_index,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* FOR MERGE, we fetch policies for UPDATE, DELETE and INSERT (and ALL)
|
||||
* and set them up so that we can enforce the appropriate policy depending
|
||||
* on the final action we take.
|
||||
*
|
||||
* We don't fetch the SELECT policies since they are correctly applied to
|
||||
* the root->mergeTarget_relation. The target rows are selected after
|
||||
* joining the mergeTarget_relation and the source relation and hence it's
|
||||
* enough to apply SELECT policies to the mergeTarget_relation.
|
||||
*
|
||||
* We don't push the UPDATE/DELETE USING quals to the RTE because we don't
|
||||
* really want to apply them while scanning the relation since we don't
|
||||
* know whether we will be doing a UPDATE or a DELETE at the end. We apply
|
||||
* the respective policy once we decide the final action on the target
|
||||
* tuple.
|
||||
*
|
||||
* XXX We are setting up USING quals as WITH CHECK. If RLS prohibits
|
||||
* UPDATE/DELETE on the target row, we shall throw an error instead of
|
||||
* silently ignoring the row. This is different than how normal
|
||||
* UPDATE/DELETE works and more in line with INSERT ON CONFLICT DO UPDATE
|
||||
* handling.
|
||||
*/
|
||||
if (commandType == CMD_MERGE)
|
||||
{
|
||||
List *merge_permissive_policies;
|
||||
List *merge_restrictive_policies;
|
||||
|
||||
/*
|
||||
* Fetch the UPDATE policies and set them up to execute on the
|
||||
* existing target row before doing UPDATE.
|
||||
*/
|
||||
get_policies_for_relation(rel, CMD_UPDATE, user_id,
|
||||
&merge_permissive_policies,
|
||||
&merge_restrictive_policies);
|
||||
|
||||
/*
|
||||
* WCO_RLS_MERGE_UPDATE_CHECK is used to check UPDATE USING quals on
|
||||
* the existing target row.
|
||||
*/
|
||||
add_with_check_options(rel, rt_index,
|
||||
WCO_RLS_MERGE_UPDATE_CHECK,
|
||||
merge_permissive_policies,
|
||||
merge_restrictive_policies,
|
||||
withCheckOptions,
|
||||
hasSubLinks,
|
||||
true);
|
||||
|
||||
/*
|
||||
* Same with DELETE policies.
|
||||
*/
|
||||
get_policies_for_relation(rel, CMD_DELETE, user_id,
|
||||
&merge_permissive_policies,
|
||||
&merge_restrictive_policies);
|
||||
|
||||
add_with_check_options(rel, rt_index,
|
||||
WCO_RLS_MERGE_DELETE_CHECK,
|
||||
merge_permissive_policies,
|
||||
merge_restrictive_policies,
|
||||
withCheckOptions,
|
||||
hasSubLinks,
|
||||
true);
|
||||
|
||||
/*
|
||||
* No special handling is required for INSERT policies. They will be
|
||||
* checked and enforced during ExecInsert(). But we must add them to
|
||||
* withCheckOptions.
|
||||
*/
|
||||
get_policies_for_relation(rel, CMD_INSERT, user_id,
|
||||
&merge_permissive_policies,
|
||||
&merge_restrictive_policies);
|
||||
|
||||
add_with_check_options(rel, rt_index,
|
||||
WCO_RLS_INSERT_CHECK,
|
||||
merge_permissive_policies,
|
||||
merge_restrictive_policies,
|
||||
withCheckOptions,
|
||||
hasSubLinks,
|
||||
false);
|
||||
|
||||
/* Enforce the WITH CHECK clauses of the UPDATE policies */
|
||||
add_with_check_options(rel, rt_index,
|
||||
WCO_RLS_UPDATE_CHECK,
|
||||
merge_permissive_policies,
|
||||
merge_restrictive_policies,
|
||||
withCheckOptions,
|
||||
hasSubLinks,
|
||||
false);
|
||||
}
|
||||
|
||||
heap_close(rel, NoLock);
|
||||
|
||||
/*
|
||||
@ -527,14 +438,6 @@ get_policies_for_relation(Relation relation, CmdType cmd, Oid user_id,
|
||||
if (policy->polcmd == ACL_DELETE_CHR)
|
||||
cmd_matches = true;
|
||||
break;
|
||||
case CMD_MERGE:
|
||||
|
||||
/*
|
||||
* We do not support a separate policy for MERGE command.
|
||||
* Instead it derives from the policies defined for other
|
||||
* commands.
|
||||
*/
|
||||
break;
|
||||
default:
|
||||
elog(ERROR, "unrecognized policy command type %d",
|
||||
(int) cmd);
|
||||
|
Reference in New Issue
Block a user