Thread: Huh? Mysterious Function Error

Huh? Mysterious Function Error

From
Josh Berkus
Date:
Tom, Stephan, Jan, Etc.
Can you help me with this one?  I can't figure out what is meant by
this error message:

I have a long, complicated PL/pgSQL function called
fn_modify_candidates(INT4,INT4,INT4).

When I call:
SELECT fn_modify_candidate(1004,5,278417036)

I get:
ERROR:  unexpected SELECT query in exec_stmt_execsql()

Help?
                -Josh Berkus

-- 
______AGLIO DATABASE SOLUTIONS___________________________                                       Josh Berkus  Complete
informationtechnology      josh@agliodbs.com   and data management solutions       (415) 565-7293  for law firms, small
businesses      fax  621-2533   and non-profit organizations.       San Francisco
 


Re: Huh? Mysterious Function Error

From
Tom Lane
Date:
Josh Berkus <josh@agliodbs.com> writes:
> ERROR:  unexpected SELECT query in exec_stmt_execsql()

plpgsql doesn't think you should execute bare SELECTs, only SELECT INTO.

On reflection this seems an overly anal-retentive restriction, since
there are cases where one might execute a SELECT for its side effects
alone ("SELECT setval()" comes to mind).

Jan, do you think there's a good case for refusing plain SELECTs?
        regards, tom lane


Re: Huh? Mysterious Function Error

From
Stephan Szabo
Date:
Does the function have any SELECTs that aren't
SELECT INTOs?

On Tue, 20 Feb 2001, Josh Berkus wrote:

> Tom, Stephan, Jan, Etc.
> 
>     Can you help me with this one?  I can't figure out what is meant by
> this error message:
> 
> I have a long, complicated PL/pgSQL function called
> fn_modify_candidates(INT4,INT4,INT4).
> 
> When I call:
> SELECT fn_modify_candidate(1004,5,278417036)
> 
> I get:
> ERROR:  unexpected SELECT query in exec_stmt_execsql()
> 
> Help?



Re: Huh? Mysterious Function Error

From
Josh Berkus
Date:
Tom, Stephan,

> Josh Berkus <josh@agliodbs.com> writes:
> > ERROR:  unexpected SELECT query in exec_stmt_execsql()
> 
> plpgsql doesn't think you should execute bare SELECTs, only SELECT INTO.

That would explain it.  I have a nested function call in the form:

SELECT fn_remove_lock(record_id, user_id);

Because  I didn't care what the function returned and SELECT is the
simplest form.  Easily fixed.

> 
> On reflection this seems an overly anal-retentive restriction, since
> there are cases where one might execute a SELECT for its side effects
> alone ("SELECT setval()" comes to mind).

> Jan, do you think there's a good case for refusing plain SELECTs?

I can think of one, myself.  In some systems (MS SQL Server), all plain
selects are returned by stored procedures as query results; thus a
stored procedure is able to return multiple rowsets.  In other systems,
the single returned rowset is given by the last palin SELECT in the
procedure.

Thus, until PGSQL *does* support stored procedures, refusing plain
SELECTs may be a good way to remind procedure-writers that we do not
have the ability to return rowsets.

For stuff like my procedure, or Tom's example, one can always designate
a dummy variable with:

dummy_variable := setval('some_sq',321);

Which should have the same effect.

-Josh Berkus


-- 
______AGLIO DATABASE SOLUTIONS___________________________                                       Josh Berkus  Complete
informationtechnology      josh@agliodbs.com   and data management solutions       (415) 565-7293  for law firms, small
businesses      fax  621-2533   and non-profit organizations.       San Francisco