]> granicus.if.org Git - postgresql/commitdiff
postgres_fdw: Fix cache lookup failure while creating error context.
authorRobert Haas <rhaas@postgresql.org>
Fri, 1 Jul 2016 15:29:25 +0000 (11:29 -0400)
committerRobert Haas <rhaas@postgresql.org>
Fri, 1 Jul 2016 15:29:25 +0000 (11:29 -0400)
This is fallout from join pushdown; get_relid_attribute_name can't
handle an attribute number of 0, indicating a whole-row reference,
and shouldn't be called in that case.

Etsuro Fujita, reviewed by Ashutosh Bapat

contrib/postgres_fdw/expected/postgres_fdw.out
contrib/postgres_fdw/postgres_fdw.c
contrib/postgres_fdw/sql/postgres_fdw.sql

index 15642e43aa07be7c1d7d36dac31d2e19a3a1d5b2..107f0b73717e22cbffeec219786301d51054f627 100644 (file)
@@ -2591,6 +2591,9 @@ CONTEXT:  column "c8" of foreign table "ft1"
 SELECT  ft1.c1,  ft2.c2, ft1.c8 FROM ft1, ft2 WHERE ft1.c1 = ft2.c1 AND ft1.c1 = 1; -- ERROR
 ERROR:  invalid input syntax for integer: "foo"
 CONTEXT:  column "c8" of foreign table "ft1"
+SELECT  ft1.c1,  ft2.c2, ft1 FROM ft1, ft2 WHERE ft1.c1 = ft2.c1 AND ft1.c1 = 1; -- ERROR
+ERROR:  invalid input syntax for integer: "foo"
+CONTEXT:  whole-row reference to foreign table "ft1"
 ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE user_enum;
 -- ===================================================================
 -- subtransaction
index ccfad1b82a3a8d1fb15e031f255104f29243a77b..93ebd8cab68253de20056da9cebf568ff9222340 100644 (file)
@@ -4528,6 +4528,7 @@ conversion_error_callback(void *arg)
 {
        const char *attname = NULL;
        const char *relname = NULL;
+       bool            is_wholerow = false;
        ConversionLocation *errpos = (ConversionLocation *) arg;
 
        if (errpos->rel)
@@ -4560,12 +4561,22 @@ conversion_error_callback(void *arg)
                Assert(IsA(var, Var));
 
                rte = rt_fetch(var->varno, estate->es_range_table);
+
+               if (var->varattno == 0)
+                       is_wholerow = true;
+               else
+                       attname = get_relid_attribute_name(rte->relid, var->varattno);
+
                relname = get_rel_name(rte->relid);
-               attname = get_relid_attribute_name(rte->relid, var->varattno);
        }
 
-       if (attname && relname)
-               errcontext("column \"%s\" of foreign table \"%s\"", attname, relname);
+       if (relname)
+       {
+               if (is_wholerow)
+                       errcontext("whole-row reference to foreign table \"%s\"", relname);
+               else if (attname)
+                       errcontext("column \"%s\" of foreign table \"%s\"", attname, relname);
+       }
 }
 
 /*
index df4060d57d1593594fa5666161f78252b54f649d..58c55a4d894791e2f09837c90803641b5ae867e7 100644 (file)
@@ -627,6 +627,7 @@ DROP FUNCTION f_test(int);
 ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE int;
 SELECT * FROM ft1 WHERE c1 = 1;  -- ERROR
 SELECT  ft1.c1,  ft2.c2, ft1.c8 FROM ft1, ft2 WHERE ft1.c1 = ft2.c1 AND ft1.c1 = 1; -- ERROR
+SELECT  ft1.c1,  ft2.c2, ft1 FROM ft1, ft2 WHERE ft1.c1 = ft2.c1 AND ft1.c1 = 1; -- ERROR
 ALTER FOREIGN TABLE ft1 ALTER COLUMN c8 TYPE user_enum;
 
 -- ===================================================================