Обсуждение: BUG #4633: Bug in PL/PgSQL "SELECT .. INTO" statement parser

Поиск
Список
Период
Сортировка

BUG #4633: Bug in PL/PgSQL "SELECT .. INTO" statement parser

От
"Oleg"
Дата:
The following bug has been logged online:

Bug reference:      4633
Logged by:          Oleg
Email address:      serovOv@gmail.com
PostgreSQL version: PostgreSQL 8.3
Operating system:   CentOS
Description:        Bug in PL/PgSQL "SELECT .. INTO" statement parser
Details:

Here is an example:

CREATE TABLE test2 (
    id BIGINT,
    chunk_id BIGINT
);
CREATE TABLE test1 (
    id BIGINT
);

CREATE OR REPLACE FUNCTION "bug" () RETURNS pg_catalog.void AS
$body$
DECLARE
    row_test1 test1%rowtype;
    row_test2 test2%rowtype;
BEGIN
    SELECT test1, test2
        FROM test1 JOIN test2 ON(chunk.id = test2.chunk_id)
        LIMIT 1
       INTO row_test1, row_test2;

END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY DEFINER;

Will throw error:
ERROR:  LIMIT #,# syntax is not supported
HINT:  Use separate LIMIT and OFFSET clauses.
QUERY:  SELECT test1, test2 FROM test1 JOIN test2 ON(chunk.id =
test2.chunk_id) LIMIT 1, 0,  $1
CONTEXT:  SQL statement in PL/PgSQL function "bug" near line 8

********** Ошибка **********

ERROR: LIMIT #,# syntax is not supported
SQL state: 42601
Подсказка:Use separate LIMIT and OFFSET clauses.
Контекст:SQL statement in PL/PgSQL function "bug" near line 8

Re: BUG #4633: Bug in PL/PgSQL "SELECT .. INTO" statement parser

От
Tom Lane
Дата:
"Oleg" <serovOv@gmail.com> writes:
> DECLARE
>     row_test1 test1%rowtype;
>     row_test2 test2%rowtype;
> BEGIN
>     SELECT test1, test2
>         FROM test1 JOIN test2 ON(chunk.id = test2.chunk_id)
>         LIMIT 1
>        INTO row_test1, row_test2;

Can't do that.  The INTO target can be either a row variable or a list
of scalar variables ... not a list of row variables.

You could probably make it work by just making the target be a "record"
variable that'd wind up containing two composite fields.

            regards, tom lane