diff --git a/src/pl/plpgsql/src/plpgsql.h b/src/pl/plpgsql/src/plpgsql.h index bfd52af3e7..b416e50c64 100644 --- a/src/pl/plpgsql/src/plpgsql.h +++ b/src/pl/plpgsql/src/plpgsql.h @@ -34,9 +34,8 @@ #undef _ #define _(x) dgettext(TEXTDOMAIN, x) -/* ---------- +/* * Compiler's namespace item types - * ---------- */ enum { @@ -46,9 +45,8 @@ enum PLPGSQL_NSTYPE_REC }; -/* ---------- +/* * A PLPGSQL_NSTYPE_LABEL stack entry must be one of these types - * ---------- */ enum PLpgSQL_label_types { @@ -57,9 +55,8 @@ enum PLpgSQL_label_types PLPGSQL_LABEL_OTHER /* anything else */ }; -/* ---------- +/* * Datum array node types - * ---------- */ enum { @@ -71,9 +68,8 @@ enum PLPGSQL_DTYPE_EXPR }; -/* ---------- +/* * Variants distinguished in PLpgSQL_type structs - * ---------- */ enum { @@ -83,9 +79,8 @@ enum PLPGSQL_TTYPE_PSEUDO /* other pseudotypes */ }; -/* ---------- +/* * Execution tree node types - * ---------- */ enum PLpgSQL_stmt_types { @@ -115,10 +110,8 @@ enum PLpgSQL_stmt_types PLPGSQL_STMT_PERFORM }; - -/* ---------- +/* * Execution node return codes - * ---------- */ enum { @@ -128,9 +121,8 @@ enum PLPGSQL_RC_CONTINUE }; -/* ---------- +/* * GET DIAGNOSTICS information items - * ---------- */ enum { @@ -149,9 +141,8 @@ enum PLPGSQL_GETDIAG_SCHEMA_NAME }; -/* -------- +/* * RAISE statement options - * -------- */ enum { @@ -166,9 +157,8 @@ enum PLPGSQL_RAISEOPTION_SCHEMA }; -/* -------- +/* * Behavioral modes for plpgsql variable resolution - * -------- */ typedef enum { @@ -182,9 +172,11 @@ typedef enum * Node and structure definitions **********************************************************************/ - -typedef struct -{ /* Postgres data type */ +/* + * Postgres data type + */ +typedef struct PLpgSQL_type +{ char *typname; /* (simple) name of the type */ Oid typoid; /* OID of the data type */ int ttype; /* PLPGSQL_TTYPE_ code */ @@ -197,31 +189,37 @@ typedef struct int32 atttypmod; /* typmod (taken from someplace else) */ } PLpgSQL_type; - /* + * Generic datum array item + * * PLpgSQL_datum is the common supertype for PLpgSQL_expr, PLpgSQL_var, * PLpgSQL_row, PLpgSQL_rec, PLpgSQL_recfield, and PLpgSQL_arrayelem */ -typedef struct -{ /* Generic datum array item */ +typedef struct PLpgSQL_datum +{ int dtype; int dno; } PLpgSQL_datum; /* + * Scalar or composite variable + * * The variants PLpgSQL_var, PLpgSQL_row, and PLpgSQL_rec share these * fields */ -typedef struct -{ /* Scalar or composite variable */ +typedef struct PLpgSQL_variable +{ int dtype; int dno; char *refname; int lineno; } PLpgSQL_variable; +/* + * SQL Query to plan and execute + */ typedef struct PLpgSQL_expr -{ /* SQL Query to plan and execute */ +{ int dtype; int dno; char *query; @@ -252,9 +250,11 @@ typedef struct PLpgSQL_expr LocalTransactionId expr_simple_lxid; } PLpgSQL_expr; - -typedef struct -{ /* Scalar variable */ +/* + * Scalar variable + */ +typedef struct PLpgSQL_var +{ int dtype; int dno; char *refname; @@ -273,19 +273,20 @@ typedef struct bool freeval; } PLpgSQL_var; - -typedef struct -{ /* Row variable */ +/* + * Row variable + */ +typedef struct PLpgSQL_row +{ int dtype; int dno; char *refname; int lineno; + /* Note: TupleDesc is only set up for named rowtypes, else it is NULL. */ TupleDesc rowtupdesc; /* - * Note: TupleDesc is only set up for named rowtypes, else it is NULL. - * * Note: if the underlying rowtype contains a dropped column, the * corresponding fieldnames[] entry will be NULL, and there is no * corresponding var (varnos[] will be -1). @@ -295,9 +296,11 @@ typedef struct int *varnos; } PLpgSQL_row; - -typedef struct -{ /* Record variable (non-fixed structure) */ +/* + * Record variable (non-fixed structure) + */ +typedef struct PLpgSQL_rec +{ int dtype; int dno; char *refname; @@ -309,22 +312,27 @@ typedef struct bool freetupdesc; } PLpgSQL_rec; - -typedef struct -{ /* Field in record */ +/* + * Field in record + */ +typedef struct PLpgSQL_recfield +{ int dtype; int dno; char *fieldname; int recparentno; /* dno of parent record */ } PLpgSQL_recfield; - -typedef struct -{ /* Element of array variable */ +/* + * Element of array variable + */ +typedef struct PLpgSQL_arrayelem +{ int dtype; int dno; PLpgSQL_expr *subscript; int arrayparentno; /* dno of parent array variable */ + /* Remaining fields are cached info about the array variable's type */ Oid parenttypoid; /* type of array variable; 0 if not yet set */ int32 parenttypmod; /* typmod of array variable */ @@ -337,49 +345,65 @@ typedef struct char elemtypalign; /* typalign of element type */ } PLpgSQL_arrayelem; - +/* + * Item in the compilers namespace tree + */ typedef struct PLpgSQL_nsitem -{ /* Item in the compilers namespace tree */ +{ int itemtype; + /* + * For labels, itemno is a value of enum PLpgSQL_label_types. For other + * itemtypes, itemno is the associated PLpgSQL_datum's dno. + */ int itemno; - /* For labels, itemno is a value of enum PLpgSQL_label_types. */ - /* For other itemtypes, itemno is the associated PLpgSQL_datum's dno. */ struct PLpgSQL_nsitem *prev; char name[FLEXIBLE_ARRAY_MEMBER]; /* nul-terminated string */ } PLpgSQL_nsitem; - -typedef struct -{ /* Generic execution node */ +/* + * Generic execution node + */ +typedef struct PLpgSQL_stmt +{ int cmd_type; int lineno; } PLpgSQL_stmt; - +/* + * One EXCEPTION condition name + */ typedef struct PLpgSQL_condition -{ /* One EXCEPTION condition name */ +{ int sqlerrstate; /* SQLSTATE code */ char *condname; /* condition name (for debugging) */ struct PLpgSQL_condition *next; } PLpgSQL_condition; -typedef struct +/* + * EXCEPTION block + */ +typedef struct PLpgSQL_exception_block { int sqlstate_varno; int sqlerrm_varno; List *exc_list; /* List of WHEN clauses */ } PLpgSQL_exception_block; -typedef struct -{ /* One EXCEPTION ... WHEN clause */ +/* + * One EXCEPTION ... WHEN clause + */ +typedef struct PLpgSQL_exception +{ int lineno; PLpgSQL_condition *conditions; List *action; /* List of statements */ } PLpgSQL_exception; - -typedef struct -{ /* Block of statements */ +/* + * Block of statements + */ +typedef struct PLpgSQL_stmt_block +{ int cmd_type; int lineno; char *label; @@ -389,39 +413,52 @@ typedef struct PLpgSQL_exception_block *exceptions; } PLpgSQL_stmt_block; - -typedef struct -{ /* Assign statement */ +/* + * Assign statement + */ +typedef struct PLpgSQL_stmt_assign +{ int cmd_type; int lineno; int varno; PLpgSQL_expr *expr; } PLpgSQL_stmt_assign; -typedef struct -{ /* PERFORM statement */ +/* + * PERFORM statement + */ +typedef struct PLpgSQL_stmt_perform +{ int cmd_type; int lineno; PLpgSQL_expr *expr; } PLpgSQL_stmt_perform; -typedef struct -{ /* Get Diagnostics item */ +/* + * GET DIAGNOSTICS item + */ +typedef struct PLpgSQL_diag_item +{ int kind; /* id for diagnostic value desired */ int target; /* where to assign it */ } PLpgSQL_diag_item; -typedef struct -{ /* Get Diagnostics statement */ +/* + * GET DIAGNOSTICS statement + */ +typedef struct PLpgSQL_stmt_getdiag +{ int cmd_type; int lineno; bool is_stacked; /* STACKED or CURRENT diagnostics area? */ List *diag_items; /* List of PLpgSQL_diag_item */ } PLpgSQL_stmt_getdiag; - -typedef struct -{ /* IF statement */ +/* + * IF statement + */ +typedef struct PLpgSQL_stmt_if +{ int cmd_type; int lineno; PLpgSQL_expr *cond; /* boolean expression for THEN */ @@ -430,15 +467,20 @@ typedef struct List *else_body; /* List of statements */ } PLpgSQL_stmt_if; -typedef struct /* one ELSIF arm of IF statement */ +/* + * one ELSIF arm of IF statement + */ +typedef struct PLpgSQL_if_elsif { int lineno; PLpgSQL_expr *cond; /* boolean expression for this case */ List *stmts; /* List of statements */ } PLpgSQL_if_elsif; - -typedef struct /* CASE statement */ +/* + * CASE statement + */ +typedef struct PLpgSQL_stmt_case { int cmd_type; int lineno; @@ -449,25 +491,32 @@ typedef struct /* CASE statement */ List *else_stmts; /* List of statements */ } PLpgSQL_stmt_case; -typedef struct /* one arm of CASE statement */ +/* + * one arm of CASE statement + */ +typedef struct PLpgSQL_case_when { int lineno; PLpgSQL_expr *expr; /* boolean expression for this case */ List *stmts; /* List of statements */ } PLpgSQL_case_when; - -typedef struct -{ /* Unconditional LOOP statement */ +/* + * Unconditional LOOP statement + */ +typedef struct PLpgSQL_stmt_loop +{ int cmd_type; int lineno; char *label; List *body; /* List of statements */ } PLpgSQL_stmt_loop; - -typedef struct -{ /* WHILE cond LOOP statement */ +/* + * WHILE cond LOOP statement + */ +typedef struct PLpgSQL_stmt_while +{ int cmd_type; int lineno; char *label; @@ -475,9 +524,11 @@ typedef struct List *body; /* List of statements */ } PLpgSQL_stmt_while; - -typedef struct -{ /* FOR statement with integer loopvar */ +/* + * FOR statement with integer loopvar + */ +typedef struct PLpgSQL_stmt_fori +{ int cmd_type; int lineno; char *label; @@ -489,13 +540,12 @@ typedef struct List *body; /* List of statements */ } PLpgSQL_stmt_fori; - /* * PLpgSQL_stmt_forq represents a FOR statement running over a SQL query. * It is the common supertype of PLpgSQL_stmt_fors, PLpgSQL_stmt_forc * and PLpgSQL_dynfors. */ -typedef struct +typedef struct PLpgSQL_stmt_forq { int cmd_type; int lineno; @@ -505,8 +555,11 @@ typedef struct List *body; /* List of statements */ } PLpgSQL_stmt_forq; -typedef struct -{ /* FOR statement running over SELECT */ +/* + * FOR statement running over SELECT + */ +typedef struct PLpgSQL_stmt_fors +{ int cmd_type; int lineno; char *label; @@ -517,8 +570,11 @@ typedef struct PLpgSQL_expr *query; } PLpgSQL_stmt_fors; -typedef struct -{ /* FOR statement running over cursor */ +/* + * FOR statement running over cursor + */ +typedef struct PLpgSQL_stmt_forc +{ int cmd_type; int lineno; char *label; @@ -530,8 +586,11 @@ typedef struct PLpgSQL_expr *argquery; /* cursor arguments if any */ } PLpgSQL_stmt_forc; -typedef struct -{ /* FOR statement running over EXECUTE */ +/* + * FOR statement running over EXECUTE + */ +typedef struct PLpgSQL_stmt_dynfors +{ int cmd_type; int lineno; char *label; @@ -543,9 +602,11 @@ typedef struct List *params; /* USING expressions */ } PLpgSQL_stmt_dynfors; - -typedef struct -{ /* FOREACH item in array loop */ +/* + * FOREACH item in array loop + */ +typedef struct PLpgSQL_stmt_foreach_a +{ int cmd_type; int lineno; char *label; @@ -555,9 +616,11 @@ typedef struct List *body; /* List of statements */ } PLpgSQL_stmt_foreach_a; - -typedef struct -{ /* OPEN a curvar */ +/* + * OPEN a curvar + */ +typedef struct PLpgSQL_stmt_open +{ int cmd_type; int lineno; int curvar; @@ -569,9 +632,11 @@ typedef struct List *params; /* USING expressions */ } PLpgSQL_stmt_open; - -typedef struct -{ /* FETCH or MOVE statement */ +/* + * FETCH or MOVE statement + */ +typedef struct PLpgSQL_stmt_fetch +{ int cmd_type; int lineno; PLpgSQL_rec *rec; /* target, as record or row */ @@ -584,17 +649,21 @@ typedef struct bool returns_multiple_rows; /* can return more than one row? */ } PLpgSQL_stmt_fetch; - -typedef struct -{ /* CLOSE curvar */ +/* + * CLOSE curvar + */ +typedef struct PLpgSQL_stmt_close +{ int cmd_type; int lineno; int curvar; } PLpgSQL_stmt_close; - -typedef struct -{ /* EXIT or CONTINUE statement */ +/* + * EXIT or CONTINUE statement + */ +typedef struct PLpgSQL_stmt_exit +{ int cmd_type; int lineno; bool is_exit; /* Is this an exit or a continue? */ @@ -602,25 +671,33 @@ typedef struct PLpgSQL_expr *cond; } PLpgSQL_stmt_exit; - -typedef struct -{ /* RETURN statement */ +/* + * RETURN statement + */ +typedef struct PLpgSQL_stmt_return +{ int cmd_type; int lineno; PLpgSQL_expr *expr; int retvarno; } PLpgSQL_stmt_return; -typedef struct -{ /* RETURN NEXT statement */ +/* + * RETURN NEXT statement + */ +typedef struct PLpgSQL_stmt_return_next +{ int cmd_type; int lineno; PLpgSQL_expr *expr; int retvarno; } PLpgSQL_stmt_return_next; -typedef struct -{ /* RETURN QUERY statement */ +/* + * RETURN QUERY statement + */ +typedef struct PLpgSQL_stmt_return_query +{ int cmd_type; int lineno; PLpgSQL_expr *query; /* if static query */ @@ -628,8 +705,11 @@ typedef struct List *params; /* USING arguments for dynamic query */ } PLpgSQL_stmt_return_query; -typedef struct -{ /* RAISE statement */ +/* + * RAISE statement + */ +typedef struct PLpgSQL_stmt_raise +{ int cmd_type; int lineno; int elog_level; @@ -639,36 +719,47 @@ typedef struct List *options; /* list of PLpgSQL_raise_option */ } PLpgSQL_stmt_raise; -typedef struct -{ /* RAISE statement option */ +/* + * RAISE statement option + */ +typedef struct PLpgSQL_raise_option +{ int opt_type; PLpgSQL_expr *expr; } PLpgSQL_raise_option; -typedef struct -{ /* ASSERT statement */ +/* + * ASSERT statement + */ +typedef struct PLpgSQL_stmt_assert +{ int cmd_type; int lineno; PLpgSQL_expr *cond; PLpgSQL_expr *message; } PLpgSQL_stmt_assert; -typedef struct -{ /* Generic SQL statement to execute */ +/* + * Generic SQL statement to execute + */ +typedef struct PLpgSQL_stmt_execsql +{ int cmd_type; int lineno; PLpgSQL_expr *sqlstmt; - bool mod_stmt; /* is the stmt INSERT/UPDATE/DELETE? */ - /* note: mod_stmt is set when we plan the query */ + bool mod_stmt; /* is the stmt INSERT/UPDATE/DELETE? Note: + mod_stmt is set when we plan the query */ bool into; /* INTO supplied? */ bool strict; /* INTO STRICT flag */ PLpgSQL_rec *rec; /* INTO target, if record */ PLpgSQL_row *row; /* INTO target, if row */ } PLpgSQL_stmt_execsql; - -typedef struct -{ /* Dynamic SQL string to execute */ +/* + * Dynamic SQL string to execute + */ +typedef struct PLpgSQL_stmt_dynexecute +{ int cmd_type; int lineno; PLpgSQL_expr *query; /* string expression */ @@ -679,9 +770,11 @@ typedef struct List *params; /* USING expressions */ } PLpgSQL_stmt_dynexecute; - +/* + * Hash lookup key for functions + */ typedef struct PLpgSQL_func_hashkey -{ /* Hash lookup key for functions */ +{ Oid funcOid; bool isTrigger; /* true if called as a trigger */ @@ -710,6 +803,9 @@ typedef struct PLpgSQL_func_hashkey Oid argtypes[FUNC_MAX_ARGS]; } PLpgSQL_func_hashkey; +/* + * Trigger type + */ typedef enum PLpgSQL_trigtype { PLPGSQL_DML_TRIGGER, @@ -717,8 +813,11 @@ typedef enum PLpgSQL_trigtype PLPGSQL_NOT_TRIGGER } PLpgSQL_trigtype; +/* + * Complete compiled function + */ typedef struct PLpgSQL_function -{ /* Complete compiled function */ +{ char *fn_signature; Oid fn_oid; TransactionId fn_xmin; @@ -777,9 +876,11 @@ typedef struct PLpgSQL_function unsigned long use_count; } PLpgSQL_function; - +/* + * Runtime execution data + */ typedef struct PLpgSQL_execstate -{ /* Runtime execution data */ +{ PLpgSQL_function *func; /* function being executed */ Datum retval; @@ -835,7 +936,6 @@ typedef struct PLpgSQL_execstate void *plugin_info; /* reserved for use by optional plugin */ } PLpgSQL_execstate; - /* * A PLpgSQL_plugin structure represents an instrumentation plugin. * To instrument PL/pgSQL, a plugin library must access the rendezvous @@ -850,24 +950,23 @@ typedef struct PLpgSQL_execstate * (if the pointers are non-NULL) to give the plugin a chance to watch * what we are doing. * - * func_setup is called when we start a function, before we've initialized - * the local variables defined by the function. + * func_setup is called when we start a function, before we've initialized + * the local variables defined by the function. * - * func_beg is called when we start a function, after we've initialized - * the local variables. + * func_beg is called when we start a function, after we've initialized + * the local variables. * - * func_end is called at the end of a function. + * func_end is called at the end of a function. * - * stmt_beg and stmt_end are called before and after (respectively) each - * statement. + * stmt_beg and stmt_end are called before and after (respectively) each + * statement. * * Also, immediately before any call to func_setup, PL/pgSQL fills in the * error_callback and assign_expr fields with pointers to its own * plpgsql_exec_error_callback and exec_assign_expr functions. This is * a somewhat ad-hoc expedient to simplify life for debugger plugins. */ - -typedef struct +typedef struct PLpgSQL_plugin { /* Function pointers set up by the plugin */ void (*func_setup) (PLpgSQL_execstate *estate, PLpgSQL_function *func); @@ -882,21 +981,22 @@ typedef struct PLpgSQL_expr *expr); } PLpgSQL_plugin; +/* + * Struct types used during parsing + */ -/* Struct types used during parsing */ - -typedef struct +typedef struct PLword { char *ident; /* palloc'd converted identifier */ bool quoted; /* Was it double-quoted? */ } PLword; -typedef struct +typedef struct PLcword { List *idents; /* composite identifiers (list of String) */ } PLcword; -typedef struct +typedef struct PLwdatum { PLpgSQL_datum *datum; /* referenced variable */ char *ident; /* valid if simple name */ @@ -950,9 +1050,8 @@ extern PLpgSQL_plugin **plpgsql_plugin_ptr; * Function declarations **********************************************************************/ -/* ---------- +/* * Functions in pl_comp.c - * ---------- */ extern PLpgSQL_function *plpgsql_compile(FunctionCallInfo fcinfo, bool forValidator); @@ -983,15 +1082,13 @@ extern void plpgsql_adddatum(PLpgSQL_datum *new); extern int plpgsql_add_initdatums(int **varnos); extern void plpgsql_HashTableInit(void); -/* ---------- +/* * Functions in pl_handler.c - * ---------- */ extern void _PG_init(void); -/* ---------- +/* * Functions in pl_exec.c - * ---------- */ extern Datum plpgsql_exec_function(PLpgSQL_function *func, FunctionCallInfo fcinfo, @@ -1009,9 +1106,8 @@ extern void plpgsql_exec_get_datum_type_info(PLpgSQL_execstate *estate, PLpgSQL_datum *datum, Oid *typeid, int32 *typmod, Oid *collation); -/* ---------- +/* * Functions for namespace handling in pl_funcs.c - * ---------- */ extern void plpgsql_ns_init(void); extern void plpgsql_ns_push(const char *label, @@ -1026,18 +1122,16 @@ extern PLpgSQL_nsitem *plpgsql_ns_lookup_label(PLpgSQL_nsitem *ns_cur, const char *name); extern PLpgSQL_nsitem *plpgsql_ns_find_nearest_loop(PLpgSQL_nsitem *ns_cur); -/* ---------- +/* * Other functions in pl_funcs.c - * ---------- */ extern const char *plpgsql_stmt_typename(PLpgSQL_stmt *stmt); extern const char *plpgsql_getdiag_kindname(int kind); extern void plpgsql_free_function_memory(PLpgSQL_function *func); extern void plpgsql_dumptree(PLpgSQL_function *func); -/* ---------- +/* * Scanner functions in pl_scanner.c - * ---------- */ extern int plpgsql_base_yylex(void); extern int plpgsql_yylex(void); @@ -1055,9 +1149,8 @@ extern int plpgsql_latest_lineno(void); extern void plpgsql_scanner_init(const char *str); extern void plpgsql_scanner_finish(void); -/* ---------- +/* * Externs in gram.y - * ---------- */ extern int plpgsql_yyparse(void);