Home > Archive > PostgreSQL Bugs > December 2005 > BUG #2123: join between stored procedures









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author BUG #2123: join between stored procedures
Konstantin S. Zhinko [tIT]

2005-12-27, 9:23 am


The following bug has been logged online:

Bug reference: 2123
Logged by: Konstantin S. Zhinko [tIT]
Email address: k.zhinko@grape.ru
PostgreSQL version: 8.1.0
Operating system: CentOS 3.5
Description: join between stored procedures
Details:

Hi all!

I have a very big problem...

Here the code:

/*SQL START*/

CREATE TABLE "public"."test_data" (
"id" INTEGER NOT NULL,
"type" INTEGER NOT NULL,
"short_text" VARCHAR(255),
CONSTRAINT "test_data_pkey" PRIMARY KEY("id")
) WITH OIDS;

CREATE TYPE "public"."ret_id" AS (
"id" INTEGER
);

CREATE TYPE "public"."test" AS (
"id" INTEGER,
"type" INTEGER,
"info" VARCHAR(255)
);

CREATE OR REPLACE FUNCTION "public"."get_obj_list" () RETURNS SETOF
"public"."ret_id" AS
$body$
declare
ret ret_id;
begin

for ret in select test_data.id from test_data
loop

return next ret;

end loop;

end;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

CREATE OR REPLACE FUNCTION "public"."get_obj" (id integer) RETURNS
"public"."test" AS
$body$
declare
ret test;
in_id alias for $1;

begin

select * from test_data a into ret where a.id=in_id;
return ret;

end;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

/*SQL END*/

It is ok, but when I try to join these procedures, server responses error

/*SQL START*/
SELECT b.*
FROM get_obj_list a
LEFT JOIN get_obj(a.id) b ON 1=1
/*SQL END*/

Error: relation "a" does not exists.

Why it's so?

---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster

Tom Lane

2005-12-27, 9:24 am

"Konstantin S. Zhinko [tIT]" <k.zhinko@grape.ru> writes:
> SELECT b.*
> FROM get_obj_list a
> LEFT JOIN get_obj(a.id) b ON 1=1
> Error: relation "a" does not exists.


This is not a bug. You cannot make use of values from one <table
reference> inside the definition of another <table reference>.
So the reference "a.id" is taken to be to a real table named "a",
not to the "a" alias elsewhere in the query.

You could do something like

SELECT (get_obj(id)).* FROM get_obj_list();

instead.

regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend

Sponsored Links





Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive | Programming forum archive

Copyright 2008 droptable.com