Re: PL/pgSQL EXECUTE '..' USING with unknown - Mailing list pgsql-hackers
From | Cédric Villemain |
---|---|
Subject | Re: PL/pgSQL EXECUTE '..' USING with unknown |
Date | |
Msg-id | AANLkTi=X5Gm1p_j_43Kh0B8kur68kQ__OX9UjJckcz5t@mail.gmail.com Whole thread Raw |
In response to | PL/pgSQL EXECUTE '..' USING with unknown (Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>) |
Responses |
Re: PL/pgSQL EXECUTE '..' USING with unknown
|
List | pgsql-hackers |
2010/8/5 Heikki Linnakangas <heikki.linnakangas@enterprisedb.com>: > There's a little problem with EXECUTE USING when the parameters are of type > unknown (going back to 8.4 where EXECUTE USING was introduced): > > do $$ > BEGIN > EXECUTE 'SELECT to_date($1, $2)' USING '17-DEC-80', 'DD-MON-YY'; > END; > $$; > ERROR: failed to find conversion function from unknown to text > CONTEXT: SQL statement "SELECT to_date($1, $2)" > PL/pgSQL function "inline_code_block" line 2 at EXECUTE statement > > The corresponding case works fine when used with PREPARE/EXECUTE: Yes, and you point out another thing. EXECUTE is a way to bypass the named prepare statement, to be sure query is replanned each time. Unfortunely the current implementation of EXECUTE USING is not working this way. If I read correctly, the internal cursor receive parameters and is similar to a named prepare in the plan it produce. I am in favor to have a complete replan for EXECUTE USING, or at least change the docs: http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN «An EXECUTE with a simple constant command string and some USING parameters, as in the first example above, is functionally equivalent to just writing the command directly in PL/pgSQL and allowing replacement of PL/pgSQL variables to happen automatically. The important difference is that EXECUTE will re-plan the command on each execution, generating a plan that is specific to the current parameter values; whereas PL/pgSQL normally creates a generic plan and caches it for re-use. In situations where the best plan depends strongly on the parameter values, EXECUTE can be significantly faster; while when the plan is not sensitive to parameter values, re-planning will be a waste.» > > postgres=# PREPARE foostmt AS SELECT to_date($1, $2); > PREPARE > postgres=# EXECUTE foostmt ('17-DEC-80', 'DD-MON-YY'); > to_date > ------------ > 1980-12-17 > (1 row) > > With PREPARE/EXECUTE, the query is analyzed with parse_analyze_varparams() > which allows unknown param types to be deduced from the context. Seems we > should use that for EXECUTE USING as well, but there's no SPI interface for > that. > > Thoughts? Should we add an SPI_prepare_varparams() function and use that? > > -- > Heikki Linnakangas > EnterpriseDB http://www.enterprisedb.com > > -- > Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-hackers > -- Cédric Villemain 2ndQuadrant http://2ndQuadrant.fr/ PostgreSQL : Expertise, Formation et Support
pgsql-hackers by date: