aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/executor/spi.c18
-rw-r--r--src/include/executor/spi.h1
-rw-r--r--src/pl/plpgsql/src/gram.y98
-rw-r--r--src/pl/plpgsql/src/pl_exec.c47
-rw-r--r--src/pl/plpgsql/src/pl_funcs.c29
-rw-r--r--src/pl/plpgsql/src/plpgsql.h21
-rw-r--r--src/pl/plpgsql/src/scan.l6
7 files changed, 105 insertions, 115 deletions
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c
index f07c0fcdbae..4c4da6c3034 100644
--- a/src/backend/executor/spi.c
+++ b/src/backend/executor/spi.c
@@ -3,22 +3,23 @@
* spi.c
* Server Programming Interface
*
- * $Id: spi.c,v 1.51 2001/01/04 02:36:52 tgl Exp $
+ * $Id: spi.c,v 1.52 2001/02/19 19:49:52 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#include "executor/spi_priv.h"
#include "access/printtup.h"
+uint32 SPI_processed = 0;
+Oid SPI_lastoid = InvalidOid;
+SPITupleTable *SPI_tuptable = NULL;
+int SPI_result;
+
static _SPI_connection *_SPI_stack = NULL;
static _SPI_connection *_SPI_current = NULL;
static int _SPI_connected = -1;
static int _SPI_curid = -1;
-DLLIMPORT uint32 SPI_processed = 0;
-DLLIMPORT SPITupleTable *SPI_tuptable = NULL;
-DLLIMPORT int SPI_result;
-
static int _SPI_execute(char *src, int tcount, _SPI_plan *plan);
static int _SPI_pquery(QueryDesc *queryDesc, EState *state, int tcount);
@@ -155,6 +156,7 @@ AtEOXact_SPI(void)
_SPI_current = _SPI_stack = NULL;
_SPI_connected = _SPI_curid = -1;
SPI_processed = 0;
+ SPI_lastoid = InvalidOid;
SPI_tuptable = NULL;
}
@@ -623,6 +625,7 @@ _SPI_execute(char *src, int tcount, _SPI_plan *plan)
CommandCounterIncrement();
SPI_processed = 0;
+ SPI_lastoid = InvalidOid;
SPI_tuptable = NULL;
_SPI_current->tuptable = NULL;
_SPI_current->qtlist = NULL;
@@ -723,6 +726,7 @@ _SPI_execute_plan(_SPI_plan *plan, Datum *Values, char *Nulls, int tcount)
CommandCounterIncrement();
SPI_processed = 0;
+ SPI_lastoid = InvalidOid;
SPI_tuptable = NULL;
_SPI_current->tuptable = NULL;
_SPI_current->qtlist = NULL;
@@ -786,6 +790,7 @@ _SPI_pquery(QueryDesc *queryDesc, EState *state, int tcount)
bool isRetrieveIntoRelation = false;
char *intoName = NULL;
int res;
+ Oid save_lastoid;
switch (operation)
{
@@ -840,6 +845,8 @@ _SPI_pquery(QueryDesc *queryDesc, EState *state, int tcount)
ExecutorRun(queryDesc, state, EXEC_FOR, (long) tcount);
_SPI_current->processed = state->es_processed;
+ save_lastoid = state->es_lastoid;
+
if (operation == CMD_SELECT && queryDesc->dest == SPI)
{
if (_SPI_checktuples())
@@ -859,6 +866,7 @@ _SPI_pquery(QueryDesc *queryDesc, EState *state, int tcount)
if (dest == SPI)
{
SPI_processed = _SPI_current->processed;
+ SPI_lastoid = save_lastoid;
SPI_tuptable = _SPI_current->tuptable;
}
queryDesc->dest = dest;
diff --git a/src/include/executor/spi.h b/src/include/executor/spi.h
index 4834ab4dd87..b95eaae4e9e 100644
--- a/src/include/executor/spi.h
+++ b/src/include/executor/spi.h
@@ -71,6 +71,7 @@ typedef struct
#define SPI_OK_CURSOR 10
extern DLLIMPORT uint32 SPI_processed;
+extern DLLIMPORT Oid SPI_lastoid;
extern DLLIMPORT SPITupleTable *SPI_tuptable;
extern DLLIMPORT int SPI_result;
diff --git a/src/pl/plpgsql/src/gram.y b/src/pl/plpgsql/src/gram.y
index f462680c8a1..29e2dd24bbd 100644
--- a/src/pl/plpgsql/src/gram.y
+++ b/src/pl/plpgsql/src/gram.y
@@ -4,7 +4,7 @@
* procedural language
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.15 2001/02/10 22:53:40 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.16 2001/02/19 19:49:53 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@@ -63,7 +63,13 @@ static PLpgSQL_expr *make_tupret_expr(PLpgSQL_row *row);
{
int nalloc;
int nused;
- int *dtnums;
+ int *nums;
+ } intlist;
+ struct
+ {
+ int nalloc;
+ int nused;
+ PLpgSQL_diag_item *dtitems;
} dtlist;
struct
{
@@ -119,11 +125,11 @@ static PLpgSQL_expr *make_tupret_expr(PLpgSQL_row *row);
%type <stmt> stmt_fors, stmt_select, stmt_perform
%type <stmt> stmt_dynexecute, stmt_dynfors, stmt_getdiag
-%type <dtlist> raise_params
+%type <intlist> raise_params
%type <ival> raise_level, raise_param
%type <str> raise_msg
-%type <dtlist> getdiag_items, getdiag_targets
+%type <dtlist> getdiag_list
%type <ival> getdiag_item, getdiag_target
%type <ival> lno
@@ -156,11 +162,11 @@ static PLpgSQL_expr *make_tupret_expr(PLpgSQL_row *row);
%token K_NOTICE
%token K_NULL
%token K_PERFORM
-%token K_PROCESSED
+%token K_ROW_COUNT
%token K_RAISE
%token K_RECORD
%token K_RENAME
-%token K_RESULT
+%token K_RESULT_OID
%token K_RETURN
%token K_REVERSE
%token K_SELECT
@@ -607,7 +613,7 @@ stmt_assign : assign_var lno K_ASSIGN expr_until_semi
}
;
-stmt_getdiag : K_GET K_DIAGNOSTICS lno K_SELECT getdiag_items K_INTO getdiag_targets ';'
+stmt_getdiag : K_GET K_DIAGNOSTICS lno getdiag_list ';'
{
PLpgSQL_stmt_getdiag *new;
@@ -616,80 +622,50 @@ stmt_getdiag : K_GET K_DIAGNOSTICS lno K_SELECT getdiag_items K_INTO getdiag_tar
new->cmd_type = PLPGSQL_STMT_GETDIAG;
new->lineno = $3;
- new->nitems = $5.nused;
- new->items = malloc(sizeof(int) * $5.nused);
- new->ntargets = $7.nused;
- new->targets = malloc(sizeof(int) * $7.nused);
- memcpy(new->items, $5.dtnums, sizeof(int) * $5.nused);
- memcpy(new->targets, $7.dtnums, sizeof(int) * $7.nused);
-
- if (new->nitems != new->ntargets)
- {
- plpgsql_error_lineno = new->lineno;
- plpgsql_comperrinfo();
- elog(ERROR, "number of diagnostic items does not match target list");
- };
+ new->ndtitems = $4.nused;
+ new->dtitems = malloc(sizeof(PLpgSQL_diag_item) * $4.nused);
+ memcpy(new->dtitems, $4.dtitems, sizeof(PLpgSQL_diag_item) * $4.nused);
$$ = (PLpgSQL_stmt *)new;
}
;
-getdiag_items : getdiag_items ',' getdiag_item
+getdiag_list : getdiag_list ',' getdiag_target K_ASSIGN getdiag_item
{
if ($1.nused == $1.nalloc)
{
$1.nalloc *= 2;
- $1.dtnums = repalloc($1.dtnums, sizeof(int) * $1.nalloc);
+ $1.dtitems = repalloc($1.dtitems, sizeof(PLpgSQL_diag_item) * $1.nalloc);
}
- $1.dtnums[$1.nused++] = $3;
+ $1.dtitems[$1.nused].target = $3;
+ $1.dtitems[$1.nused].item = $5;
+ $1.nused++;
$$.nalloc = $1.nalloc;
$$.nused = $1.nused;
- $$.dtnums = $1.dtnums;
+ $$.dtitems = $1.dtitems;
}
- | getdiag_item
+ | getdiag_target K_ASSIGN getdiag_item
{
$$.nalloc = 1;
$$.nused = 1;
- $$.dtnums = palloc(sizeof(int) * $$.nalloc);
- $$.dtnums[0] = $1;
- }
- ;
-
-getdiag_item : K_PROCESSED
- {
- $$ = PLPGSQL_GETDIAG_PROCESSED;
- }
- | K_RESULT
- {
- $$ = PLPGSQL_GETDIAG_RESULT;
+ $$.dtitems = palloc(sizeof(PLpgSQL_diag_item) * $$.nalloc);
+ $$.dtitems[0].target = $1;
+ $$.dtitems[0].item = $3;
}
;
-getdiag_targets : getdiag_targets ',' getdiag_target
+getdiag_item : K_ROW_COUNT
{
- if ($1.nused == $1.nalloc)
- {
- $1.nalloc *= 2;
- $1.dtnums = repalloc($1.dtnums, sizeof(int) * $1.nalloc);
- }
- $1.dtnums[$1.nused++] = $3;
-
- $$.nalloc = $1.nalloc;
- $$.nused = $1.nused;
- $$.dtnums = $1.dtnums;
+ $$ = PLPGSQL_GETDIAG_ROW_COUNT;
}
- | getdiag_target
+ | K_RESULT_OID
{
- $$.nalloc = 1;
- $$.nused = 1;
- $$.dtnums = palloc(sizeof(int) * $$.nalloc);
- $$.dtnums[0] = $1;
+ $$ = PLPGSQL_GETDIAG_RESULT_OID;
}
;
-
-getdiag_target : T_VARIABLE
+getdiag_target : T_VARIABLE
{
if (yylval.var->isconst)
{
@@ -1070,7 +1046,7 @@ stmt_raise : K_RAISE lno raise_level raise_msg raise_params ';'
new->message = $4;
new->nparams = $5.nused;
new->params = malloc(sizeof(int) * $5.nused);
- memcpy(new->params, $5.dtnums, sizeof(int) * $5.nused);
+ memcpy(new->params, $5.nums, sizeof(int) * $5.nused);
$$ = (PLpgSQL_stmt *)new;
}
@@ -1116,20 +1092,20 @@ raise_params : raise_params raise_param
if ($1.nused == $1.nalloc)
{
$1.nalloc *= 2;
- $1.dtnums = repalloc($1.dtnums, sizeof(int) * $1.nalloc);
+ $1.nums = repalloc($1.nums, sizeof(int) * $1.nalloc);
}
- $1.dtnums[$1.nused++] = $2;
+ $1.nums[$1.nused++] = $2;
$$.nalloc = $1.nalloc;
$$.nused = $1.nused;
- $$.dtnums = $1.dtnums;
+ $$.nums = $1.nums;
}
| raise_param
{
$$.nalloc = 1;
$$.nused = 1;
- $$.dtnums = palloc(sizeof(int) * $$.nalloc);
- $$.dtnums[0] = $1;
+ $$.nums = palloc(sizeof(int) * $$.nalloc);
+ $$.nums[0] = $1;
}
;
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
index 92787ec270b..94dc0be45de 100644
--- a/src/pl/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -3,7 +3,7 @@
* procedural language
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.37 2001/02/09 00:14:26 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.38 2001/02/19 19:49:53 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@@ -82,7 +82,7 @@ static int exec_stmt(PLpgSQL_execstate * estate,
static int exec_stmt_assign(PLpgSQL_execstate * estate,
PLpgSQL_stmt_assign * stmt);
static int exec_stmt_getdiag(PLpgSQL_execstate * estate,
- PLpgSQL_stmt_getdiag * stmt);
+ PLpgSQL_stmt_getdiag * stmt);
static int exec_stmt_if(PLpgSQL_execstate * estate,
PLpgSQL_stmt_if * stmt);
static int exec_stmt_loop(PLpgSQL_execstate * estate,
@@ -507,9 +507,9 @@ plpgsql_exec_trigger(PLpgSQL_function * func,
case PLPGSQL_STMT_ASSIGN:
stmttype = "assignment";
break;
- case PLPGSQL_STMT_GETDIAG:
- stmttype = "get diagnostics";
- break;
+ case PLPGSQL_STMT_GETDIAG:
+ stmttype = "get diagnostics";
+ break;
case PLPGSQL_STMT_IF:
stmttype = "if";
break;
@@ -1071,35 +1071,40 @@ exec_stmt_getdiag(PLpgSQL_execstate * estate, PLpgSQL_stmt_getdiag * stmt)
PLpgSQL_datum *var;
bool isnull = false;
- for ( i=0 ; i < stmt->nitems ; i++)
+ for ( i=0 ; i < stmt->ndtitems ; i++)
{
- if ((stmt->targets[i] <= 0))
- break;
+ PLpgSQL_diag_item *dtitem = & stmt->dtitems[i];
+
+ if (dtitem->target <= 0)
+ continue;
- var = (estate->datums[stmt->targets[i]]);
+ var = (estate->datums[dtitem->target]);
if (var == NULL)
- break;
+ continue;
- switch (stmt->items[i])
+ switch (dtitem->item)
{
- case PLPGSQL_GETDIAG_PROCESSED:
+ case PLPGSQL_GETDIAG_ROW_COUNT:
- exec_assign_value(estate, var, (Datum)SPI_processed, INT4OID, &isnull);
- break;
+ exec_assign_value(estate, var, UInt32GetDatum(SPI_processed),
+ INT4OID, &isnull);
+ break;
- case PLPGSQL_GETDIAG_RESULT:
+ case PLPGSQL_GETDIAG_RESULT_OID:
- exec_assign_value(estate, var, (Datum)SPI_result, INT4OID, &isnull);
- break;
+ exec_assign_value(estate, var, ObjectIdGetDatum(SPI_lastoid),
+ OIDOID, &isnull);
+ break;
default:
- elog(ERROR, "unknown attribute request %d in get_diagnostic", stmt->items[i]);
- };
- };
+ elog(ERROR, "unknown attribute request %d in get_diagnostic",
+ dtitem->item);
+ }
+ }
- return PLPGSQL_RC_OK;
+ return PLPGSQL_RC_OK;
}
/* ----------
diff --git a/src/pl/plpgsql/src/pl_funcs.c b/src/pl/plpgsql/src/pl_funcs.c
index d3bc9d315be..2b3605d2a10 100644
--- a/src/pl/plpgsql/src/pl_funcs.c
+++ b/src/pl/plpgsql/src/pl_funcs.c
@@ -3,7 +3,7 @@
* procedural language
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_funcs.c,v 1.9 2000/12/03 20:45:40 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_funcs.c,v 1.10 2001/02/19 19:49:53 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@@ -708,20 +708,24 @@ dump_getdiag(PLpgSQL_stmt_getdiag * stmt)
int i;
dump_ind();
- printf("GET DIAGNOSTICS SELECT ");
- for (i = 0; i < stmt->nitems; i++)
+ printf("GET DIAGNOSTICS ");
+ for (i = 0; i < stmt->ndtitems; i++)
{
+ PLpgSQL_diag_item *dtitem = & stmt->dtitems[i];
+
if (i != 0)
printf(", ");
- switch (stmt->items[i])
+ printf("{var %d} = ", dtitem->target);
+
+ switch (dtitem->item)
{
- case PLPGSQL_GETDIAG_PROCESSED:
- printf("PROCESSED");
+ case PLPGSQL_GETDIAG_ROW_COUNT:
+ printf("ROW_COUNT");
break;
- case PLPGSQL_GETDIAG_RESULT:
- printf("RESULT");
+ case PLPGSQL_GETDIAG_RESULT_OID:
+ printf("RESULT_OID");
break;
default:
@@ -729,15 +733,6 @@ dump_getdiag(PLpgSQL_stmt_getdiag * stmt)
break;
}
}
- printf(" INTO ");
- for (i = 0; i < stmt->ntargets; i++)
- {
- if (i != 0)
- printf(", ");
-
- printf("{var %d}", stmt->targets[i]);
- }
-
printf("\n");
}
diff --git a/src/pl/plpgsql/src/plpgsql.h b/src/pl/plpgsql/src/plpgsql.h
index e03fed063c0..727035bbb61 100644
--- a/src/pl/plpgsql/src/plpgsql.h
+++ b/src/pl/plpgsql/src/plpgsql.h
@@ -3,7 +3,7 @@
* procedural language
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.11 2000/09/05 09:02:18 wieck Exp $
+ * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.12 2001/02/19 19:49:53 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@@ -115,8 +115,8 @@ enum
*/
enum
{
- PLPGSQL_GETDIAG_PROCESSED,
- PLPGSQL_GETDIAG_RESULT
+ PLPGSQL_GETDIAG_ROW_COUNT,
+ PLPGSQL_GETDIAG_RESULT_OID
};
@@ -277,14 +277,19 @@ typedef struct
PLpgSQL_expr *expr;
} PLpgSQL_stmt_assign;
+
+typedef struct
+{ /* Get Diagnostics item */
+ int item; /* id for diagnostic value desired */
+ int target; /* where to assign it */
+} PLpgSQL_diag_item;
+
typedef struct
-{ /* Get Disgnostics statement */
+{ /* Get Diagnostics statement */
int cmd_type;
int lineno;
- int nitems;
- int *items;
- int ntargets;
- int *targets;
+ int ndtitems;
+ PLpgSQL_diag_item *dtitems;
} PLpgSQL_stmt_getdiag;
diff --git a/src/pl/plpgsql/src/scan.l b/src/pl/plpgsql/src/scan.l
index 2b19039ef07..5872a4eddb8 100644
--- a/src/pl/plpgsql/src/scan.l
+++ b/src/pl/plpgsql/src/scan.l
@@ -4,7 +4,7 @@
* procedural language
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.l,v 1.8 2000/09/15 11:59:40 ishii Exp $
+ * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.l,v 1.9 2001/02/19 19:49:53 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@@ -114,13 +114,13 @@ not { return K_NOT; }
notice { return K_NOTICE; }
null { return K_NULL; }
perform { return K_PERFORM; }
-processed { return K_PROCESSED; }
raise { return K_RAISE; }
record { return K_RECORD; }
rename { return K_RENAME; }
-result { return K_RESULT; }
+result_oid { return K_RESULT_OID; }
return { return K_RETURN; }
reverse { return K_REVERSE; }
+row_count { return K_ROW_COUNT; }
select { return K_SELECT; }
then { return K_THEN; }
to { return K_TO; }