| From: | Jonathan Rogers <jrogers(at)socialserve(dot)com> |
|---|---|
| To: | pgsql-general(at)postgresql(dot)org |
| Subject: | PL/Python prepare example's use of setdefault |
| Date: | 2014-10-15 21:39:46 |
| Message-ID: | 543EE9A2.3090302@socialserve.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-general |
I was just reading the PL/Python docs section "42.7.1 Database Access
Functions" and saw this example:
CREATE FUNCTION usesavedplan() RETURNS trigger AS $$
plan = SD.setdefault("plan", plpy.prepare("SELECT 1"))
# rest of function
$$ LANGUAGE plpythonu;
The above example uses the plpy.prepare() function, reusing the result
across function calls uses setdefault(). Unfortunately, since
setdefault() is a method on dict objects, the values passed to it must
be evaluated before it can be called. Therefore, plpy.prepare() will be
called every time usesavedplan() executes whether a result already
exists in the SD dict or not.
I'm not sure if it's a problem that plpy.prepare() is called every time
since the result is discarded if a prepared statement had been cached by
a previous execution of usesavedplan(). It seems that some wasted
processing will occur, but maybe not enough to matter. The documentation
for SPI_prepare() does not clearly state what tasks that function
performs other than constructing a prepared statement object. It seems
to imply that parsing does occur within SPI_prepare(). It does state
that query planning occurs within SPI_execute_plan().
Can anyone clarify what occurs when plpy.prepare() is called? Is it
worth using a Python conditional to determine whether to call it rather
than using SD.setdefault()?
--
Jonathan Ross Rogers
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Adrian Klaver | 2014-10-15 21:51:06 | Re: PL/Python prepare example's use of setdefault |
| Previous Message | John R Pierce | 2014-10-15 17:21:53 | Re: Any postgres API available to get errorcode for PQerrorMessage |