From 9aac62305b13a5cf7e8ded2020ffca25f9d666be Mon Sep 17 00:00:00 2001
From: Bruce Momjian
Date: Mon, 10 Jun 2002 19:47:57 +0000
Subject: [PATCH] Add item for plpgsql temp table access.
---
doc/FAQ | 15 ++++++++++++++-
doc/src/FAQ/FAQ.html | 39 +++++++++++++++++++++++++--------------
2 files changed, 39 insertions(+), 15 deletions(-)
diff --git a/doc/FAQ b/doc/FAQ
index 2c4193a833..c888981949 100644
--- a/doc/FAQ
+++ b/doc/FAQ
@@ -1,7 +1,7 @@
Frequently Asked Questions (FAQ) for PostgreSQL
- Last updated: Fri Apr 26 23:03:46 EDT 2002
+ Last updated: Mon Jun 10 15:47:38 EDT 2002
Current maintainer: Bruce Momjian (pgman@candle.pha.pa.us)
@@ -92,6 +92,8 @@
4.23) How do I perform an outer join?
4.24) How do I perform queries using multiple databases?
4.25) How do I return multiple rows or columns from a function?
+ 4.26) Why can't I reliably create/drop temporary tables in PL/PgSQL
+ functions?
Extending PostgreSQL
@@ -1031,6 +1033,17 @@ SELECT *
http://developer.postgresql.org/docs/postgres/plpgsql-cursors.html,
section 23.7.3.3.
+ 4.26) Why can't I reliably create/drop temporary tables in PL/PgSQL
+ functions?
+
+ PL/PgSQL caches function contents, and an unfortunate side effect is
+ that if a PL/PgSQL function accesses a temporary table, and that table
+ is later dropped and recreated, and the function called again, the
+ function will fail because the cached function contents still point to
+ the old temporary table. The solution is to use EXECUTE for temporary
+ table access in PL/PgSQL. This will cause the query to be reparsed
+ every time.
+
Extending PostgreSQL
5.1) I wrote a user-defined function. When I run it in psql, why does it
diff --git a/doc/src/FAQ/FAQ.html b/doc/src/FAQ/FAQ.html
index 988aa3f968..8ca6cd9c45 100644
--- a/doc/src/FAQ/FAQ.html
+++ b/doc/src/FAQ/FAQ.html
@@ -14,7 +14,7 @@
alink="#0000ff">
Frequently Asked Questions (FAQ) for PostgreSQL
- Last updated: Fri Apr 26 23:03:46 EDT 2002
+ Last updated: Mon Jun 10 15:47:38 EDT 2002
Current maintainer: Bruce Momjian (pgman@candle.pha.pa.us)
@@ -138,7 +138,9 @@
4.24) How do I perform queries using multiple
databases?
4.25) How do I return multiple rows or columns
- from a function?
+ from a function?
+ 4.26) Why can't I reliably create/drop
+ temporary tables in PL/PgSQL functions?
Extending PostgreSQL
@@ -742,7 +744,7 @@
You can also compile with profiling to see what functions are
taking execution time. The backend profile files will be deposited
in the pgsql/data/base/dbname directory. The client profile
- file will be put in the client's current directory. Linux requires
+ file will be put in the client's current directory. Linux requires
a compile with -DLINUX_PROFILE for proper profiling.
3.8) Why do I get "Sorry, too many
@@ -900,9 +902,9 @@
databases, and users are defined?
psql has a variety of backslash commands to show such
- information. Use \? to see them. There are also system tables
- beginning with pg_ that describe these too. Also, psql
- -l will list all databases.
+ information. Use \? to see them. There are also system tables
+ beginning with pg_ that describe these too. Also, psql
+ -l will list all databases.
Also try the file pgsql/src/tutorial/syscat.source. It
illustrates many of the SELECTs needed to get
@@ -1307,16 +1309,25 @@ BYTEA bytea variable-length byte array (null-byte safe)
different databases and merge the information that way.
- 4.25) How do I return multiple rows or columns
- from a function?
+ 4.25) How do I return multiple rows or
+ columns from a function?
- You can return result sets from PL/pgSQL functions using
- refcursors. See
- http://developer.postgresql.org/docs/postgres/plpgsql-cursors.html,
- section 23.7.3.3.
+ You can return result sets from PL/pgSQL functions using
+ refcursors. See
+ http://developer.postgresql.org/docs/postgres/plpgsql-cursors.html,
+ section 23.7.3.3.
+
+ 4.26) Why can't I reliably create/drop
+ temporary tables in PL/PgSQL functions?
+ PL/PgSQL caches function contents, and an unfortunate side effect
+ is that if a PL/PgSQL function accesses a temporary table, and that
+ table is later dropped and recreated, and the function called
+ again, the function will fail because the cached function contents
+ still point to the old temporary table. The solution is to use
+ EXECUTE for temporary table access in PL/PgSQL. This
+ will cause the query to be reparsed every time.
-
Extending PostgreSQL
5.1) I wrote a user-defined function. When I