#undef _
#define _(x) dgettext(TEXTDOMAIN, x)
-/* ----------
+/*
* Compiler's namespace item types
- * ----------
*/
enum
{
PLPGSQL_NSTYPE_REC
};
-/* ----------
+/*
* A PLPGSQL_NSTYPE_LABEL stack entry must be one of these types
- * ----------
*/
enum PLpgSQL_label_types
{
PLPGSQL_LABEL_OTHER /* anything else */
};
-/* ----------
+/*
* Datum array node types
- * ----------
*/
enum
{
PLPGSQL_DTYPE_EXPR
};
-/* ----------
+/*
* Variants distinguished in PLpgSQL_type structs
- * ----------
*/
enum
{
PLPGSQL_TTYPE_PSEUDO /* other pseudotypes */
};
-/* ----------
+/*
* Execution tree node types
- * ----------
*/
enum PLpgSQL_stmt_types
{
PLPGSQL_STMT_PERFORM
};
-
-/* ----------
+/*
* Execution node return codes
- * ----------
*/
enum
{
PLPGSQL_RC_CONTINUE
};
-/* ----------
+/*
* GET DIAGNOSTICS information items
- * ----------
*/
enum
{
PLPGSQL_GETDIAG_SCHEMA_NAME
};
-/* --------
+/*
* RAISE statement options
- * --------
*/
enum
{
PLPGSQL_RAISEOPTION_SCHEMA
};
-/* --------
+/*
* Behavioral modes for plpgsql variable resolution
- * --------
*/
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 */
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;
LocalTransactionId expr_simple_lxid;
} PLpgSQL_expr;
-
-typedef struct
-{ /* Scalar variable */
+/*
+ * Scalar variable
+ */
+typedef struct PLpgSQL_var
+{
int dtype;
int dno;
char *refname;
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).
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;
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 */
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;
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 */
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;
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;
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;
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;
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;
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;
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;
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;
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;
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 */
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? */
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 */
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;
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 */
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 */
Oid argtypes[FUNC_MAX_ARGS];
} PLpgSQL_func_hashkey;
+/*
+ * Trigger type
+ */
typedef enum PLpgSQL_trigtype
{
PLPGSQL_DML_TRIGGER,
PLPGSQL_NOT_TRIGGER
} PLpgSQL_trigtype;
+/*
+ * Complete compiled function
+ */
typedef struct PLpgSQL_function
-{ /* Complete compiled function */
+{
char *fn_signature;
Oid fn_oid;
TransactionId fn_xmin;
unsigned long use_count;
} PLpgSQL_function;
-
+/*
+ * Runtime execution data
+ */
typedef struct PLpgSQL_execstate
-{ /* Runtime execution data */
+{
PLpgSQL_function *func; /* function being executed */
Datum retval;
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
* (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);
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 */
* Function declarations
**********************************************************************/
-/* ----------
+/*
* Functions in pl_comp.c
- * ----------
*/
extern PLpgSQL_function *plpgsql_compile(FunctionCallInfo fcinfo,
bool forValidator);
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,
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,
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);
extern void plpgsql_scanner_init(const char *str);
extern void plpgsql_scanner_finish(void);
-/* ----------
+/*
* Externs in gram.y
- * ----------
*/
extern int plpgsql_yyparse(void);