v77_diff_amit.1.patch
application/octet-stream
Filename: v77_diff_amit.1.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
Series: patch v77
| File | + | − |
|---|---|---|
| src/backend/commands/publicationcmds.c | 41 | 16 |
| src/test/regress/expected/publication.out | 3 | 3 |
diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c
index b1c29e0..9e8b726 100644
--- a/src/backend/commands/publicationcmds.c
+++ b/src/backend/commands/publicationcmds.c
@@ -376,6 +376,8 @@ contain_invalid_rfcolumn(Oid pubid, Relation relation, List *ancestors,
/*
* Is this a simple Node permitted within a row filter expression?
+ *
+ * We can allow other node types after more analysis and testing.
*/
static bool
IsRowFilterSimpleExpr(Node *node)
@@ -395,6 +397,7 @@ IsRowFilterSimpleExpr(Node *node)
case T_NullTest:
case T_RelabelType:
case T_XmlExpr:
+ case T_List:
return true;
default:
return false;
@@ -410,6 +413,37 @@ contain_mutable_or_ud_functions_checker(Oid func_id, void *context)
}
/*
+ * Check, if the node contains any unallowed object in node. See
+ * check_simple_rowfilter_expr_walker.
+ *
+ * Returns the error detail meesage in errdetail_msg for unallowed expressions.
+ */
+static bool
+expr_allowed_in_node(Node *node, ParseState *pstate, char **errdetail_msg)
+{
+ if (IsA(node, List))
+ {
+ /*
+ * OK, we don't need to perform other expr checks for list because those are
+ * undefined for list.
+ */
+ return true;
+ }
+
+ if (exprType(node) >= FirstNormalObjectId)
+ *errdetail_msg = _("User-defined types are not allowed.");
+ if (check_functions_in_node(node, contain_mutable_or_ud_functions_checker,
+ (void*) pstate))
+ *errdetail_msg = _("User-defined or built-in mutable functions are not allowed.");
+ else if (exprCollation(node) >= FirstNormalObjectId)
+ *errdetail_msg = _("User-defined collations are not allowed.");
+ else if (exprInputCollation(node) >= FirstNormalObjectId)
+ *errdetail_msg = _("User-defined collations are not allowed.");
+
+ return true;
+}
+
+/*
* The row filter walker checks if the row filter expression is a "simple
* expression".
*
@@ -452,21 +486,6 @@ check_simple_rowfilter_expr_walker(Node *node, ParseState *pstate)
if (node == NULL)
return false;
-
- /* Check for mutable or user defined functions in node itself */
- if (check_functions_in_node(node, contain_mutable_or_ud_functions_checker,
- (void *) pstate))
- errdetail_msg = _("User-defined or mutable functions are not allowed");
- else if (IsA(node, List))
- {
- /* OK, node is part of simple expressions */
- }
- else if (exprCollation(node) >= FirstNormalObjectId)
- errdetail_msg = _("User-defined collations are not allowed.");
- else if (exprInputCollation(node) >= FirstNormalObjectId)
- errdetail_msg = _("User-defined collations are not allowed.");
- else if (exprType(node) >= FirstNormalObjectId)
- errdetail_msg = _("User-defined types are not allowed.");
else if (IsA(node, Var))
{
/* System columns are not allowed. */
@@ -500,12 +519,18 @@ check_simple_rowfilter_expr_walker(Node *node, ParseState *pstate)
}
}
}
- else if (!IsRowFilterSimpleExpr(node))
+ else if (IsRowFilterSimpleExpr(node))
+ {
+ }
+ else
{
elog(DEBUG3, "row filter contains an unexpected expression component: %s", nodeToString(node));
errdetail_msg = _("Expressions only allow columns, constants, built-in operators, built-in data types, built-in collations and immutable built-in functions.");
}
+ if (!errdetail_msg)
+ expr_allowed_in_node(node, pstate, &errdetail_msg);
+
if (errdetail_msg)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
diff --git a/src/test/regress/expected/publication.out b/src/test/regress/expected/publication.out
index f785efe..c1f70b7 100644
--- a/src/test/regress/expected/publication.out
+++ b/src/test/regress/expected/publication.out
@@ -371,20 +371,20 @@ CREATE PUBLICATION testpub6 FOR TABLE testpub_rf_tbl3 WHERE (e =#> 27);
ERROR: invalid publication WHERE expression
LINE 1: ...ICATION testpub6 FOR TABLE testpub_rf_tbl3 WHERE (e =#> 27);
^
-DETAIL: User-defined or mutable functions are not allowed
+DETAIL: User-defined operators are not allowed.
-- fail - user-defined functions are not allowed
CREATE FUNCTION testpub_rf_func2() RETURNS integer AS $$ BEGIN RETURN 123; END; $$ LANGUAGE plpgsql;
ALTER PUBLICATION testpub5 ADD TABLE testpub_rf_tbl1 WHERE (a >= testpub_rf_func2());
ERROR: invalid publication WHERE expression
LINE 1: ...ON testpub5 ADD TABLE testpub_rf_tbl1 WHERE (a >= testpub_rf...
^
-DETAIL: User-defined or mutable functions are not allowed
+DETAIL: User-defined or built-in mutable functions are not allowed.
-- fail - non-immutable functions are not allowed. random() is volatile.
ALTER PUBLICATION testpub5 ADD TABLE testpub_rf_tbl1 WHERE (a < random());
ERROR: invalid publication WHERE expression
LINE 1: ...ION testpub5 ADD TABLE testpub_rf_tbl1 WHERE (a < random());
^
-DETAIL: User-defined or mutable functions are not allowed
+DETAIL: User-defined or built-in mutable functions are not allowed.
-- ok - NULLIF is allowed
ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl1 WHERE (NULLIF(1,2) = a);
-- ok - built-in operators are allowed