0002-ship-only-shippable-regfoo-consts.patch
text/x-diff
Filename: 0002-ship-only-shippable-regfoo-consts.patch
Type: text/x-diff
Part: 1
Patch
Format: unified
Series: patch 0002
| File | + | − |
|---|---|---|
| contrib/postgres_fdw/deparse.c | 72 | 0 |
diff --git a/contrib/postgres_fdw/deparse.c b/contrib/postgres_fdw/deparse.c
index 8f4d8a5022..a9766f9734 100644
--- a/contrib/postgres_fdw/deparse.c
+++ b/contrib/postgres_fdw/deparse.c
@@ -37,11 +37,14 @@
#include "access/sysattr.h"
#include "access/table.h"
#include "catalog/pg_aggregate.h"
+#include "catalog/pg_authid.h"
#include "catalog/pg_collation.h"
#include "catalog/pg_namespace.h"
#include "catalog/pg_operator.h"
#include "catalog/pg_opfamily.h"
#include "catalog/pg_proc.h"
+#include "catalog/pg_ts_config.h"
+#include "catalog/pg_ts_dict.h"
#include "catalog/pg_type.h"
#include "commands/defrem.h"
#include "nodes/makefuncs.h"
@@ -384,6 +387,75 @@ foreign_expr_walker(Node *node,
{
Const *c = (Const *) node;
+ /*
+ * Constants of regproc and related types can't be shipped
+ * unless the referenced object is shippable. But NULL's ok.
+ * (See also the related code in dependency.c.)
+ */
+ if (!c->constisnull)
+ {
+ switch (c->consttype)
+ {
+ case REGPROCOID:
+ case REGPROCEDUREOID:
+ if (!is_shippable(DatumGetObjectId(c->constvalue),
+ ProcedureRelationId, fpinfo))
+ return false;
+ break;
+ case REGOPEROID:
+ case REGOPERATOROID:
+ if (!is_shippable(DatumGetObjectId(c->constvalue),
+ OperatorRelationId, fpinfo))
+ return false;
+ break;
+ case REGCLASSOID:
+ if (!is_shippable(DatumGetObjectId(c->constvalue),
+ RelationRelationId, fpinfo))
+ return false;
+ break;
+ case REGTYPEOID:
+ if (!is_shippable(DatumGetObjectId(c->constvalue),
+ TypeRelationId, fpinfo))
+ return false;
+ break;
+ case REGCOLLATIONOID:
+ if (!is_shippable(DatumGetObjectId(c->constvalue),
+ CollationRelationId, fpinfo))
+ return false;
+ break;
+ case REGCONFIGOID:
+
+ /*
+ * For text search objects only, we weaken the
+ * normal shippability criterion to allow all OIDs
+ * below FirstNormalObjectId. Without this, none
+ * of the initdb-installed TS configurations would
+ * be shippable, which would be quite annoying.
+ */
+ if (DatumGetObjectId(c->constvalue) >= FirstNormalObjectId &&
+ !is_shippable(DatumGetObjectId(c->constvalue),
+ TSConfigRelationId, fpinfo))
+ return false;
+ break;
+ case REGDICTIONARYOID:
+ if (DatumGetObjectId(c->constvalue) >= FirstNormalObjectId &&
+ !is_shippable(DatumGetObjectId(c->constvalue),
+ TSDictionaryRelationId, fpinfo))
+ return false;
+ break;
+ case REGNAMESPACEOID:
+ if (!is_shippable(DatumGetObjectId(c->constvalue),
+ NamespaceRelationId, fpinfo))
+ return false;
+ break;
+ case REGROLEOID:
+ if (!is_shippable(DatumGetObjectId(c->constvalue),
+ AuthIdRelationId, fpinfo))
+ return false;
+ break;
+ }
+ }
+
/*
* If the constant has nondefault collation, either it's of a
* non-builtin type, or it reflects folding of a CollateExpr.