INSERT INTO a SELECT * FROM a
- tuples inserted are invisible for SELECT' scan. In effect, this
+ tuples inserted are invisible for SELECT's scan. In effect, this
duplicates the database table within itself (subject to unique index
rules, of course) without recursing.
This example of SPI usage demonstrates the visibility rule.
- There are more complex examples in in src/test/regress/regress.c and
+ There are more complex examples in src/test/regress/regress.c and
in contrib/spi.
executed:
-#include "executor/spi.h" /* this is what you need to work with SPI */
+#include "executor/spi.h" /* this is what you need to work with SPI */
int execq(text *sql, int cnt);
int
execq(text *sql, int cnt)
{
- int ret;
- int proc = 0;
-
- SPI_connect();
-
- ret = SPI_exec(textout(sql), cnt);
-
- proc = SPI_processed;
- /*
- * If this is SELECT and some tuple(s) fetched -
- * returns tuples to the caller via elog (NOTICE).
- */
- if ( ret == SPI_OK_SELECT && SPI_processed > 0 )
- {
- TupleDesc tupdesc = SPI_tuptable->tupdesc;
- SPITupleTable *tuptable = SPI_tuptable;
- char buf[8192];
- int i;
-
- for (ret = 0; ret < proc; ret++)
- {
- HeapTuple tuple = tuptable->vals[ret];
-
- for (i = 1, buf[0] = 0; i <= tupdesc->natts; i++)
- sprintf(buf + strlen (buf), " %s%s",
- SPI_getvalue(tuple, tupdesc, i),
- (i == tupdesc->natts) ? " " : " |");
- elog (NOTICE, "EXECQ: %s", buf);
- }
- }
-
- SPI_finish();
-
- return (proc);
+ char *query;
+ int ret;
+ int proc;
+
+ /* Convert given TEXT object to a C string */
+ query = DatumGetCString(DirectFunctionCall1(textout,
+ PointerGetDatum(sql)));
+
+ SPI_connect();
+
+ ret = SPI_exec(query, cnt);
+
+ proc = SPI_processed;
+ /*
+ * If this is SELECT and some tuple(s) fetched -
+ * returns tuples to the caller via elog (NOTICE).
+ */
+ if ( ret == SPI_OK_SELECT && SPI_processed > 0 )
+ {
+ TupleDesc tupdesc = SPI_tuptable->tupdesc;
+ SPITupleTable *tuptable = SPI_tuptable;
+ char buf[8192];
+ int i,j;
+
+ for (j = 0; j < proc; j++)
+ {
+ HeapTuple tuple = tuptable->vals[j];
+
+ for (i = 1, buf[0] = 0; i <= tupdesc->natts; i++)
+ sprintf(buf + strlen (buf), " %s%s",
+ SPI_getvalue(tuple, tupdesc, i),
+ (i == tupdesc->natts) ? " " : " |");
+ elog (NOTICE, "EXECQ: %s", buf);
+ }
+ }
+
+ SPI_finish();
+
+ pfree(query);
+
+ return (proc);
}