diff options
Diffstat (limited to 'contrib/plpgsql/src/plpgsql.h')
-rw-r--r-- | contrib/plpgsql/src/plpgsql.h | 475 |
1 files changed, 475 insertions, 0 deletions
diff --git a/contrib/plpgsql/src/plpgsql.h b/contrib/plpgsql/src/plpgsql.h new file mode 100644 index 00000000000..406a6897521 --- /dev/null +++ b/contrib/plpgsql/src/plpgsql.h @@ -0,0 +1,475 @@ +/********************************************************************** + * plpgsql.h - Definitions for the PL/pgSQL + * procedural language + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/contrib/plpgsql/src/Attic/plpgsql.h,v 1.1 1998/08/22 12:38:33 momjian 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; + int16 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; + 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 */ |