postgresql/src/pl/plpgsql/src/plpgsql.h

509 lines
11 KiB
C

/**********************************************************************
* plpgsql.h - Definitions for the PL/pgSQL
* procedural language
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.3.2.1 2000/01/16 00:45:33 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
* The author hereby grants permission to use, copy, modify,
* distribute, and license this software and its documentation
* for any purpose, provided that existing copyright notices are
* retained in all copies and that this notice is included
* verbatim in any distributions. No written agreement, license,
* or royalty fee is required for any of the authorized uses.
* Modifications to this software may be copyrighted by their
* author and need not follow the licensing terms described
* here, provided that the new terms are clearly indicated on
* the first page of each file where they apply.
*
* IN NO EVENT SHALL THE AUTHOR OR DISTRIBUTORS BE LIABLE TO ANY
* PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR
* CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS
* SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, EVEN
* IF THE AUTHOR HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
* THE AUTHOR AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON
* AN "AS IS" BASIS, AND THE AUTHOR AND DISTRIBUTORS HAVE NO
* OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*
**********************************************************************/
#ifndef PLPGSQL_H
#define PLPGSQL_H
#include <stdio.h>
#include <stdarg.h>
#include "postgres.h"
#include "executor/spi.h"
#include "commands/trigger.h"
#include "fmgr.h"
/**********************************************************************
* Definitions
**********************************************************************/
/* ----------
* Compilers namestack item types
* ----------
*/
enum
{
PLPGSQL_NSTYPE_LABEL,
PLPGSQL_NSTYPE_VAR,
PLPGSQL_NSTYPE_ROW,
PLPGSQL_NSTYPE_REC,
PLPGSQL_NSTYPE_RECFIELD
};
/* ----------
* Datum array node types
* ----------
*/
enum
{
PLPGSQL_DTYPE_VAR,
PLPGSQL_DTYPE_ROW,
PLPGSQL_DTYPE_REC,
PLPGSQL_DTYPE_RECFIELD,
PLPGSQL_DTYPE_EXPR,
PLPGSQL_DTYPE_TRIGARG
};
/* ----------
* Execution tree node types
* ----------
*/
enum
{
PLPGSQL_STMT_BLOCK,
PLPGSQL_STMT_ASSIGN,
PLPGSQL_STMT_IF,
PLPGSQL_STMT_LOOP,
PLPGSQL_STMT_WHILE,
PLPGSQL_STMT_FORI,
PLPGSQL_STMT_FORS,
PLPGSQL_STMT_SELECT,
PLPGSQL_STMT_EXIT,
PLPGSQL_STMT_RETURN,
PLPGSQL_STMT_RAISE,
PLPGSQL_STMT_EXECSQL
};
/* ----------
* Execution node return codes
* ----------
*/
enum
{
PLPGSQL_RC_OK,
PLPGSQL_RC_EXIT,
PLPGSQL_RC_RETURN
};
/**********************************************************************
* Node and structure definitions
**********************************************************************/
typedef struct
{ /* Dynamic string control structure */
int alloc;
int used;
char *value;
} PLpgSQL_dstring;
typedef struct
{ /* Postgres base data type */
char *typname;
Oid typoid;
FmgrInfo typinput;
bool typbyval;
int32 atttypmod;
} PLpgSQL_type;
typedef struct
{ /* Generic datum array item */
int dtype;
int dno;
} PLpgSQL_datum;
typedef struct
{ /* SQL Query to plan and execute */
int dtype;
int exprno;
char *query;
void *plan;
Node *plan_simple_expr;
Oid plan_simple_type;
Oid *plan_argtypes;
int nparams;
int params[1];
} PLpgSQL_expr;
typedef struct
{ /* Local variable */
int dtype;
int varno;
char *refname;
int lineno;
PLpgSQL_type *datatype;
int isconst;
int notnull;
PLpgSQL_expr *default_val;
Datum value;
bool isnull;
int shouldfree;
} PLpgSQL_var;
typedef struct
{ /* Rowtype */
int dtype;
int rowno;
char *refname;
int lineno;
Oid rowtypeclass;
int nfields;
char **fieldnames;
int *varnos;
} PLpgSQL_row;
typedef struct
{ /* Record of undefined structure */
int dtype;
int recno;
char *refname;
int lineno;
HeapTuple tup;
TupleDesc tupdesc;
} PLpgSQL_rec;
typedef struct
{ /* Field in record */
int dtype;
int rfno;
char *fieldname;
int recno;
} PLpgSQL_recfield;
typedef struct
{ /* Positional argument to trigger */
int dtype;
int dno;
PLpgSQL_expr *argnum;
} PLpgSQL_trigarg;
typedef struct
{ /* Item in the compilers namestack */
int itemtype;
int itemno;
char name[1];
} PLpgSQL_nsitem;
typedef struct PLpgSQL_ns
{ /* Compiler namestack level */
int items_alloc;
int items_used;
PLpgSQL_nsitem **items;
struct PLpgSQL_ns *upper;
} PLpgSQL_ns;
typedef struct
{ /* List of execution nodes */
int stmts_alloc;
int stmts_used;
struct PLpgSQL_stmt **stmts;
} PLpgSQL_stmts;
typedef struct
{ /* Generic execution node */
int cmd_type;
int lineno;
} PLpgSQL_stmt;
typedef struct
{ /* Block of statements */
int cmd_type;
int lineno;
char *label;
PLpgSQL_stmts *body;
int n_initvars;
int *initvarnos;
} PLpgSQL_stmt_block;
typedef struct
{ /* Assign statement */
int cmd_type;
int lineno;
int varno;
PLpgSQL_expr *expr;
} PLpgSQL_stmt_assign;
typedef struct
{ /* IF statement */
int cmd_type;
int lineno;
PLpgSQL_expr *cond;
PLpgSQL_stmts *true_body;
PLpgSQL_stmts *false_body;
} PLpgSQL_stmt_if;
typedef struct
{ /* Unconditional LOOP statement */
int cmd_type;
int lineno;
char *label;
PLpgSQL_stmts *body;
} PLpgSQL_stmt_loop;
typedef struct
{ /* WHILE cond LOOP statement */
int cmd_type;
int lineno;
char *label;
PLpgSQL_expr *cond;
PLpgSQL_stmts *body;
} PLpgSQL_stmt_while;
typedef struct
{ /* FOR statement with integer loopvar */
int cmd_type;
int lineno;
char *label;
PLpgSQL_var *var;
PLpgSQL_expr *lower;
PLpgSQL_expr *upper;
int reverse;
PLpgSQL_stmts *body;
} PLpgSQL_stmt_fori;
typedef struct
{ /* FOR statement running over SELECT */
int cmd_type;
int lineno;
char *label;
PLpgSQL_rec *rec;
PLpgSQL_row *row;
PLpgSQL_expr *query;
PLpgSQL_stmts *body;
} PLpgSQL_stmt_fors;
typedef struct
{ /* SELECT ... INTO statement */
int cmd_type;
int lineno;
PLpgSQL_rec *rec;
PLpgSQL_row *row;
PLpgSQL_expr *query;
} PLpgSQL_stmt_select;
typedef struct
{ /* EXIT statement */
int cmd_type;
int lineno;
char *label;
PLpgSQL_expr *cond;
} PLpgSQL_stmt_exit;
typedef struct
{ /* RETURN statement */
int cmd_type;
int lineno;
bool retistuple;
PLpgSQL_expr *expr;
int retrecno;
} PLpgSQL_stmt_return;
typedef struct
{ /* RAISE statement */
int cmd_type;
int lineno;
int elog_level;
char *message;
int nparams;
int *params;
} PLpgSQL_stmt_raise;
typedef struct
{ /* Generic SQL statement to execute */
int cmd_type;
int lineno;
PLpgSQL_expr *sqlstmt;
} PLpgSQL_stmt_execsql;
typedef struct PLpgSQL_function
{ /* Complete compiled function */
Oid fn_oid;
char *fn_name;
int fn_functype;
Oid fn_rettype;
int fn_rettyplen;
bool fn_retbyval;
FmgrInfo fn_retinput;
bool fn_retistuple;
bool fn_retset;
int fn_nargs;
int fn_argvarnos[MAXFMGRARGS];
int found_varno;
int new_varno;
int old_varno;
int tg_name_varno;
int tg_when_varno;
int tg_level_varno;
int tg_op_varno;
int tg_relid_varno;
int tg_relname_varno;
int tg_nargs_varno;
int ndatums;
PLpgSQL_datum **datums;
PLpgSQL_stmt_block *action;
struct PLpgSQL_function *next;
} PLpgSQL_function;
typedef struct
{ /* Runtime execution data */
Datum retval;
bool retisnull;
Oid rettype;
bool retistuple;
TupleDesc rettupdesc;
bool retisset;
char *exitlabel;
int trig_nargs;
Datum *trig_argv;
int found_varno;
int ndatums;
PLpgSQL_datum **datums;
} PLpgSQL_execstate;
/**********************************************************************
* Global variable declarations
**********************************************************************/
extern int plpgsql_DumpExecTree;
extern int plpgsql_SpaceScanned;
extern int plpgsql_nDatums;
extern PLpgSQL_datum **plpgsql_Datums;
extern int plpgsql_error_lineno;
extern char *plpgsql_error_funcname;
extern PLpgSQL_function *plpgsql_curr_compile;
/**********************************************************************
* Function declarations
**********************************************************************/
extern char *pstrdup(char *s);
/* ----------
* Functions in pl_comp.c
* ----------
*/
extern PLpgSQL_function *plpgsql_compile(Oid fn_oid, int functype);
extern int plpgsql_parse_word(char *word);
extern int plpgsql_parse_dblword(char *string);
extern int plpgsql_parse_tripword(char *string);
extern int plpgsql_parse_wordtype(char *string);
extern int plpgsql_parse_dblwordtype(char *string);
extern int plpgsql_parse_wordrowtype(char *string);
extern void plpgsql_adddatum(PLpgSQL_datum * new);
extern int plpgsql_add_initdatums(int **varnos);
extern void plpgsql_comperrinfo(void);
/* ----------
* Functions in pl_exec.c
* ----------
*/
extern Datum plpgsql_exec_function(PLpgSQL_function * func,
FmgrValues *args, bool *isNull);
extern HeapTuple plpgsql_exec_trigger(PLpgSQL_function * func,
TriggerData *trigdata);
/* ----------
* Functions for the dynamic string handling in pl_funcs.c
* ----------
*/
extern void plpgsql_dstring_init(PLpgSQL_dstring * ds);
extern void plpgsql_dstring_free(PLpgSQL_dstring * ds);
extern void plpgsql_dstring_append(PLpgSQL_dstring * ds, char *str);
extern char *plpgsql_dstring_get(PLpgSQL_dstring * ds);
/* ----------
* Functions for the namestack handling in pl_funcs.c
* ----------
*/
extern void plpgsql_ns_init(void);
extern bool plpgsql_ns_setlocal(bool flag);
extern void plpgsql_ns_push(char *label);
extern void plpgsql_ns_pop(void);
extern void plpgsql_ns_additem(int itemtype, int itemno, char *name);
extern PLpgSQL_nsitem *plpgsql_ns_lookup(char *name, char *nsname);
extern void plpgsql_ns_rename(char *oldname, char *newname);
/* ----------
* Other functions in pl_funcs.c
* ----------
*/
extern void plpgsql_dumptree(PLpgSQL_function * func);
extern char *plpgsql_tolower(char *s);
/* ----------
* Externs in gram.y and scan.l
* ----------
*/
extern PLpgSQL_expr *plpgsql_read_expression(int until, char *s);
extern void plpgsql_yyrestart(FILE *fp);
extern int plpgsql_yylex();
extern void plpgsql_setinput(char *s, int functype);
extern int plpgsql_yyparse();
#endif /* PLPGSQL_H */