131 const char *name1,
const char *name2,
const char *name3,
135 while (ns_cur != NULL)
140 for (nsitem = ns_cur;
142 nsitem = nsitem->
prev)
144 if (strcmp(nsitem->
name, name1) == 0)
158 strcmp(nsitem->
name, name1) == 0)
160 for (nsitem = ns_cur;
162 nsitem = nsitem->
prev)
164 if (strcmp(nsitem->
name, name2) == 0)
180 ns_cur = nsitem->
prev;
197 while (ns_cur != NULL)
202 ns_cur = ns_cur->
prev;
216 while (ns_cur != NULL)
221 ns_cur = ns_cur->
prev;
234 switch (
stmt->cmd_type)
237 return _(
"statement block");
239 return _(
"assignment");
249 return _(
"FOR with integer loop variable");
251 return _(
"FOR over SELECT rows");
253 return _(
"FOR over cursor");
255 return _(
"FOREACH over array");
261 return "RETURN NEXT";
263 return "RETURN QUERY";
269 return _(
"SQL statement");
273 return _(
"FOR over EXECUTE statement");
276 "GET STACKED DIAGNOSTICS" :
"GET DIAGNOSTICS";
307 return "PG_ROUTINE_OID";
311 return "PG_EXCEPTION_CONTEXT";
313 return "PG_EXCEPTION_DETAIL";
315 return "PG_EXCEPTION_HINT";
317 return "RETURNED_SQLSTATE";
319 return "COLUMN_NAME";
321 return "CONSTRAINT_NAME";
323 return "PG_DATATYPE_NAME";
325 return "MESSAGE_TEXT";
329 return "SCHEMA_NAME";
359#define plpgsql_statement_tree_walker(s, sw, ew, c) \
360 plpgsql_statement_tree_walker_impl(s, (plpgsql_stmt_walker_callback) (sw), \
361 (plpgsql_expr_walker_callback) (ew), c)
369#define S_WALK(st) stmt_callback(st, context)
370#define E_WALK(ex) expr_callback(ex, context)
371#define S_LIST_WALK(lst) foreach_ptr(PLpgSQL_stmt, st, lst) S_WALK(st)
372#define E_LIST_WALK(lst) foreach_ptr(PLpgSQL_expr, ex, lst) E_WALK(ex)
374 switch (
stmt->cmd_type)
708 if (expr && expr->
plan)
832 switch (
stmt->cmd_type)
937 if (block->
label == NULL)
957 printf(
" EXCEPTION WHEN ");
992 foreach(l,
stmt->elsif_list)
1023 foreach(l,
stmt->case_when_list)
1037 if (
stmt->have_else)
1080 printf(
"FORI %s %s\n",
stmt->var->refname, (
stmt->reverse) ?
"REVERSE" :
"NORMAL");
1128 if (
stmt->argquery != NULL)
1148 if (
stmt->slice != 0)
1167 if (
stmt->argquery != NULL)
1170 printf(
" arguments = '");
1174 if (
stmt->query != NULL)
1181 if (
stmt->dynquery != NULL)
1198 foreach(lc,
stmt->params)
1201 printf(
" parameter $%d: ",
i++);
1222 if (
stmt->target != NULL)
1225 printf(
" target = %d %s\n",
1226 stmt->target->dno,
stmt->target->refname);
1242 switch (
stmt->direction)
1257 printf(
"??? unknown cursor direction %d",
stmt->direction);
1282 printf(
"PERFORM expr = ");
1291 printf(
"%s expr = ",
stmt->is_call ?
"CALL" :
"DO");
1301 printf(
"COMMIT AND CHAIN\n");
1311 printf(
"ROLLBACK AND CHAIN\n");
1320 printf(
"%s",
stmt->is_exit ?
"EXIT" :
"CONTINUE");
1321 if (
stmt->label != NULL)
1323 if (
stmt->cond != NULL)
1336 if (
stmt->retvarno >= 0)
1338 else if (
stmt->expr != NULL)
1350 if (
stmt->retvarno >= 0)
1352 else if (
stmt->expr != NULL)
1371 printf(
"RETURN QUERY EXECUTE ");
1384 foreach(lc,
stmt->params)
1387 printf(
" parameter $%d: ",
i++);
1410 foreach(lc,
stmt->params)
1413 printf(
" parameter %d: ",
i++);
1422 foreach(lc,
stmt->options)
1445 printf(
" CONSTRAINT = ");
1474 if (
stmt->message != NULL)
1493 if (
stmt->target != NULL)
1496 printf(
" INTO%s target = %d %s\n",
1497 stmt->strict ?
" STRICT" :
"",
1498 stmt->target->dno,
stmt->target->refname);
1512 if (
stmt->target != NULL)
1515 printf(
" INTO%s target = %d %s\n",
1516 stmt->strict ?
" STRICT" :
"",
1517 stmt->target->dno,
stmt->target->refname);
1528 foreach(lc,
stmt->params)
1531 printf(
" parameter %d: ",
i++);
1544 printf(
"FORS %s EXECUTE ",
stmt->var->refname);
1557 foreach(lc,
stmt->params)
1560 printf(
" parameter $%d: ",
i++);
1577 printf(
"GET %s DIAGNOSTICS ",
stmt->is_stacked ?
"STACKED" :
"CURRENT");
1578 foreach(lc,
stmt->diag_items)
1606 printf(
"\nExecution tree of successfully compiled PL/pgSQL function %s:\n",
1609 printf(
"\nFunction's data area:\n");
1622 printf(
"VAR %-16s type %s (typoid %u) atttypmod %d\n",
1664 printf(
"REC %-16s typoid %u\n",
1679 printf(
"RECFIELD %-16s of REC %d\n",
1687 printf(
"\nFunction's statements:\n");
void bms_free(Bitmapset *a)
bool bms_is_member(int x, const Bitmapset *a)
Bitmapset * bms_add_member(Bitmapset *a, int x)
Bitmapset * bms_copy(const Bitmapset *a)
Assert(PointerIsAligned(start, uint64))
void MemoryContextDelete(MemoryContext context)
#define foreach_ptr(type, var, lst)
static ListCell * list_head(const List *l)
static void dump_dynexecute(PLpgSQL_stmt_dynexecute *stmt)
static void dump_return_next(PLpgSQL_stmt_return_next *stmt)
void plpgsql_ns_pop(void)
void(* plpgsql_stmt_walker_callback)(PLpgSQL_stmt *stmt, void *context)
static void dump_close(PLpgSQL_stmt_close *stmt)
static void dump_perform(PLpgSQL_stmt_perform *stmt)
static void dump_if(PLpgSQL_stmt_if *stmt)
static void dump_fetch(PLpgSQL_stmt_fetch *stmt)
void plpgsql_ns_init(void)
static void dump_execsql(PLpgSQL_stmt_execsql *stmt)
static void dump_case(PLpgSQL_stmt_case *stmt)
PLpgSQL_nsitem * plpgsql_ns_find_nearest_loop(PLpgSQL_nsitem *ns_cur)
static void dump_open(PLpgSQL_stmt_open *stmt)
PLpgSQL_nsitem * plpgsql_ns_lookup_label(PLpgSQL_nsitem *ns_cur, const char *name)
static void dump_assign(PLpgSQL_stmt_assign *stmt)
static void dump_stmts(List *stmts)
static void plpgsql_statement_tree_walker_impl(PLpgSQL_stmt *stmt, plpgsql_stmt_walker_callback stmt_callback, plpgsql_expr_walker_callback expr_callback, void *context)
PLpgSQL_nsitem * plpgsql_ns_lookup(PLpgSQL_nsitem *ns_cur, bool localmode, const char *name1, const char *name2, const char *name3, int *names_used)
void plpgsql_delete_callback(CachedFunction *cfunc)
static void dump_cursor_direction(PLpgSQL_stmt_fetch *stmt)
void plpgsql_dumptree(PLpgSQL_function *func)
static void mark_stmt(PLpgSQL_stmt *stmt, Bitmapset *local_dnos)
static PLpgSQL_nsitem * ns_top
const char * plpgsql_stmt_typename(PLpgSQL_stmt *stmt)
void(* plpgsql_expr_walker_callback)(PLpgSQL_expr *expr, void *context)
static void dump_loop(PLpgSQL_stmt_loop *stmt)
static void dump_raise(PLpgSQL_stmt_raise *stmt)
static void dump_rollback(PLpgSQL_stmt_rollback *stmt)
void plpgsql_free_function_memory(PLpgSQL_function *func)
static void dump_while(PLpgSQL_stmt_while *stmt)
static void dump_expr(PLpgSQL_expr *expr)
void plpgsql_mark_local_assignment_targets(PLpgSQL_function *func)
static void dump_stmt(PLpgSQL_stmt *stmt)
void plpgsql_ns_additem(PLpgSQL_nsitem_type itemtype, int itemno, const char *name)
static void dump_block(PLpgSQL_stmt_block *block)
static void dump_getdiag(PLpgSQL_stmt_getdiag *stmt)
static void dump_exit(PLpgSQL_stmt_exit *stmt)
static void free_stmt(PLpgSQL_stmt *stmt, void *context)
static void dump_call(PLpgSQL_stmt_call *stmt)
static void dump_forc(PLpgSQL_stmt_forc *stmt)
static void dump_ind(void)
static void dump_commit(PLpgSQL_stmt_commit *stmt)
static void dump_return(PLpgSQL_stmt_return *stmt)
static void free_expr(PLpgSQL_expr *expr, void *context)
#define plpgsql_statement_tree_walker(s, sw, ew, c)
void plpgsql_ns_push(const char *label, PLpgSQL_label_type label_type)
static void dump_foreach_a(PLpgSQL_stmt_foreach_a *stmt)
PLpgSQL_nsitem * plpgsql_ns_top(void)
static void dump_return_query(PLpgSQL_stmt_return_query *stmt)
static void dump_assert(PLpgSQL_stmt_assert *stmt)
static void dump_dynfors(PLpgSQL_stmt_dynfors *stmt)
const char * plpgsql_getdiag_kindname(PLpgSQL_getdiag_kind kind)
static void dump_fori(PLpgSQL_stmt_fori *stmt)
static void dump_fors(PLpgSQL_stmt_fors *stmt)
static void mark_expr(PLpgSQL_expr *expr, Bitmapset *local_dnos)
@ PLPGSQL_STMT_RETURN_QUERY
@ PLPGSQL_STMT_RETURN_NEXT
@ PLPGSQL_STMT_DYNEXECUTE
@ PLPGSQL_RAISEOPTION_COLUMN
@ PLPGSQL_RAISEOPTION_TABLE
@ PLPGSQL_RAISEOPTION_SCHEMA
@ PLPGSQL_RAISEOPTION_CONSTRAINT
@ PLPGSQL_RAISEOPTION_DETAIL
@ PLPGSQL_RAISEOPTION_MESSAGE
@ PLPGSQL_RAISEOPTION_HINT
@ PLPGSQL_RAISEOPTION_ERRCODE
@ PLPGSQL_RAISEOPTION_DATATYPE
@ PLPGSQL_GETDIAG_ERROR_DETAIL
@ PLPGSQL_GETDIAG_SCHEMA_NAME
@ PLPGSQL_GETDIAG_MESSAGE_TEXT
@ PLPGSQL_GETDIAG_DATATYPE_NAME
@ PLPGSQL_GETDIAG_TABLE_NAME
@ PLPGSQL_GETDIAG_CONSTRAINT_NAME
@ PLPGSQL_GETDIAG_COLUMN_NAME
@ PLPGSQL_GETDIAG_ROW_COUNT
@ PLPGSQL_GETDIAG_RETURNED_SQLSTATE
@ PLPGSQL_GETDIAG_CONTEXT
@ PLPGSQL_GETDIAG_ERROR_HINT
@ PLPGSQL_GETDIAG_ERROR_CONTEXT
@ PLPGSQL_GETDIAG_ROUTINE_OID
int SPI_freeplan(SPIPlanPtr plan)
struct PLpgSQL_condition * next
PLpgSQL_getdiag_kind kind
PLpgSQL_condition * conditions
int fn_argvarnos[FUNC_MAX_ARGS]
PLpgSQL_stmt_block * action
char name[FLEXIBLE_ARRAY_MEMBER]
struct PLpgSQL_nsitem * prev
PLpgSQL_nsitem_type itemtype
PLpgSQL_raise_option_type opt_type
PLpgSQL_expr * default_val
PLpgSQL_exception_block * exceptions
PLpgSQL_promise_type promise
int cursor_explicit_argrow
PLpgSQL_expr * cursor_explicit_expr
PLpgSQL_expr * default_val