Re: Weird results when using schemas

From: Michael Fuhr <mike(at)fuhr(dot)org>
To: Geert Jansen <geert(at)boskant(dot)nl>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: Weird results when using schemas
Date: 2005-11-21 05:17:12
Message-ID: 20051121051712.GA66990@winnie.fuhr.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Mon, Nov 21, 2005 at 01:56:38AM +0100, Geert Jansen wrote:
> I'm experiencing some weird results with SELECT queries when I recently
> switched to using schemas. Basically, the same query works OK when I set
> my search_path to include the schema, but it doesn't when I qualify the
> tables in my query.
>
> One query that demonstrates the behaviour is (apologies for the long query).
>
> shs=> SELECT
> shs.city.id,shs.city.code,shs.city.name,shs.city.description,shs.city.mod_date,shs.city.mod_user
> FROM (shs.city AS city INNER JOIN shs.object_city_relationship ON
> shs.object_city_relationship.city_id = city.id INNER JOIN shs.object AS
> object ON shs.object_city_relationship.object_id = object.id) WHERE
> object.id = 1;
> NOTICE: adding missing FROM-clause entry for table "city"

You refer to shs.city.<column> in the select list, but in the from
clause you've aliased shs.city to city. As the SELECT documentation
says,

When an alias is provided, it completely hides the actual name
of the table or function; for example given FROM foo AS f, the
remainder of the SELECT must refer to this FROM item as f not foo.

Here's a simpler example:

test=> SELECT shs.city.id, shs.city.name FROM shs.city AS city;
NOTICE: adding missing FROM-clause entry for table "city"
id | name
----+--------
1 | Alanya
2 | Bodrum
1 | Alanya
2 | Bodrum
(4 rows)

In recent versions of PostgreSQL (7.4 and later) you can disable
add_missing_from to force an error instead of a notice, and in 8.1
it's off by default. I'd recommend setting it to off to avoid these
kinds of unexpected results.

test=> SET add_missing_from TO off;
SET

test=> SELECT shs.city.id, shs.city.name FROM shs.city AS city;
ERROR: missing FROM-clause entry for table "city"

test=> SELECT city.id, city.name FROM shs.city AS city;
id | name
----+--------
1 | Alanya
2 | Bodrum
(2 rows)

Try this query:

SELECT city.id, city.code, city.name, city.description,
city.mod_date, city.mod_user
FROM shs.city AS city
INNER JOIN shs.object_city_relationship AS ocr ON ocr.city_id = city.id
INNER JOIN shs.object AS object ON ocr.object_id = object.id
WHERE object.id = 1;

Here's what I get:

id | code | name | description | mod_date | mod_user
----+--------+--------+-------------+----------------------------+----------
2 | bodrum | Bodrum | bodrum | 2005-11-21 00:03:53.786452 | 0
(1 row)

--
Michael Fuhr

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Marc G. Fournier 2005-11-21 06:41:27 Test, ignore ...
Previous Message Stephan Szabo 2005-11-21 04:39:51 Re: Weird results when using schemas