aboutsummaryrefslogtreecommitdiff
path: root/contrib/postgres_fdw/deparse.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/postgres_fdw/deparse.c')
-rw-r--r--contrib/postgres_fdw/deparse.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/contrib/postgres_fdw/deparse.c b/contrib/postgres_fdw/deparse.c
index 8f09cd51ca8..dd25699d83f 100644
--- a/contrib/postgres_fdw/deparse.c
+++ b/contrib/postgres_fdw/deparse.c
@@ -1806,10 +1806,27 @@ deparseNullTest(NullTest *node, deparse_expr_cxt *context)
appendStringInfoChar(buf, '(');
deparseExpr(node->arg, context);
- if (node->nulltesttype == IS_NULL)
- appendStringInfoString(buf, " IS NULL)");
+
+ /*
+ * For scalar inputs, we prefer to print as IS [NOT] NULL, which is
+ * shorter and traditional. If it's a rowtype input but we're applying a
+ * scalar test, must print IS [NOT] DISTINCT FROM NULL to be semantically
+ * correct.
+ */
+ if (node->argisrow || !type_is_rowtype(exprType((Node *) node->arg)))
+ {
+ if (node->nulltesttype == IS_NULL)
+ appendStringInfoString(buf, " IS NULL)");
+ else
+ appendStringInfoString(buf, " IS NOT NULL)");
+ }
else
- appendStringInfoString(buf, " IS NOT NULL)");
+ {
+ if (node->nulltesttype == IS_NULL)
+ appendStringInfoString(buf, " IS NOT DISTINCT FROM NULL)");
+ else
+ appendStringInfoString(buf, " IS DISTINCT FROM NULL)");
+ }
}
/*