Header And Logo

PostgreSQL
| The world's most advanced open source database.

Functions | Variables

pl_funcs.c File Reference

#include "plpgsql.h"
#include "utils/memutils.h"
Include dependency graph for pl_funcs.c:

Go to the source code of this file.

Functions

void plpgsql_ns_init (void)
void plpgsql_ns_push (const char *label)
void plpgsql_ns_pop (void)
PLpgSQL_nsitemplpgsql_ns_top (void)
void plpgsql_ns_additem (int itemtype, int itemno, const char *name)
PLpgSQL_nsitemplpgsql_ns_lookup (PLpgSQL_nsitem *ns_cur, bool localmode, const char *name1, const char *name2, const char *name3, int *names_used)
PLpgSQL_nsitemplpgsql_ns_lookup_label (PLpgSQL_nsitem *ns_cur, const char *name)
const char * plpgsql_stmt_typename (PLpgSQL_stmt *stmt)
const char * plpgsql_getdiag_kindname (int kind)
static void free_stmt (PLpgSQL_stmt *stmt)
static void free_block (PLpgSQL_stmt_block *block)
static void free_assign (PLpgSQL_stmt_assign *stmt)
static void free_if (PLpgSQL_stmt_if *stmt)
static void free_case (PLpgSQL_stmt_case *stmt)
static void free_loop (PLpgSQL_stmt_loop *stmt)
static void free_while (PLpgSQL_stmt_while *stmt)
static void free_fori (PLpgSQL_stmt_fori *stmt)
static void free_fors (PLpgSQL_stmt_fors *stmt)
static void free_forc (PLpgSQL_stmt_forc *stmt)
static void free_foreach_a (PLpgSQL_stmt_foreach_a *stmt)
static void free_exit (PLpgSQL_stmt_exit *stmt)
static void free_return (PLpgSQL_stmt_return *stmt)
static void free_return_next (PLpgSQL_stmt_return_next *stmt)
static void free_return_query (PLpgSQL_stmt_return_query *stmt)
static void free_raise (PLpgSQL_stmt_raise *stmt)
static void free_execsql (PLpgSQL_stmt_execsql *stmt)
static void free_dynexecute (PLpgSQL_stmt_dynexecute *stmt)
static void free_dynfors (PLpgSQL_stmt_dynfors *stmt)
static void free_getdiag (PLpgSQL_stmt_getdiag *stmt)
static void free_open (PLpgSQL_stmt_open *stmt)
static void free_fetch (PLpgSQL_stmt_fetch *stmt)
static void free_close (PLpgSQL_stmt_close *stmt)
static void free_perform (PLpgSQL_stmt_perform *stmt)
static void free_expr (PLpgSQL_expr *expr)
static void free_stmts (List *stmts)
void plpgsql_free_function_memory (PLpgSQL_function *func)
static void dump_ind (void)
static void dump_stmt (PLpgSQL_stmt *stmt)
static void dump_block (PLpgSQL_stmt_block *block)
static void dump_assign (PLpgSQL_stmt_assign *stmt)
static void dump_if (PLpgSQL_stmt_if *stmt)
static void dump_case (PLpgSQL_stmt_case *stmt)
static void dump_loop (PLpgSQL_stmt_loop *stmt)
static void dump_while (PLpgSQL_stmt_while *stmt)
static void dump_fori (PLpgSQL_stmt_fori *stmt)
static void dump_fors (PLpgSQL_stmt_fors *stmt)
static void dump_forc (PLpgSQL_stmt_forc *stmt)
static void dump_foreach_a (PLpgSQL_stmt_foreach_a *stmt)
static void dump_exit (PLpgSQL_stmt_exit *stmt)
static void dump_return (PLpgSQL_stmt_return *stmt)
static void dump_return_next (PLpgSQL_stmt_return_next *stmt)
static void dump_return_query (PLpgSQL_stmt_return_query *stmt)
static void dump_raise (PLpgSQL_stmt_raise *stmt)
static void dump_execsql (PLpgSQL_stmt_execsql *stmt)
static void dump_dynexecute (PLpgSQL_stmt_dynexecute *stmt)
static void dump_dynfors (PLpgSQL_stmt_dynfors *stmt)
static void dump_getdiag (PLpgSQL_stmt_getdiag *stmt)
static void dump_open (PLpgSQL_stmt_open *stmt)
static void dump_fetch (PLpgSQL_stmt_fetch *stmt)
static void dump_cursor_direction (PLpgSQL_stmt_fetch *stmt)
static void dump_close (PLpgSQL_stmt_close *stmt)
static void dump_perform (PLpgSQL_stmt_perform *stmt)
static void dump_expr (PLpgSQL_expr *expr)
static void dump_stmts (List *stmts)
void plpgsql_dumptree (PLpgSQL_function *func)

Variables

static PLpgSQL_nsitemns_top = NULL
static int dump_indent

Function Documentation

static void dump_assign ( PLpgSQL_stmt_assign stmt  )  [static]

Definition at line 878 of file pl_funcs.c.

References dump_expr(), dump_ind(), PLpgSQL_stmt_assign::expr, and PLpgSQL_stmt_assign::varno.

Referenced by dump_stmt().

{
    dump_ind();
    printf("ASSIGN var %d := ", stmt->varno);
    dump_expr(stmt->expr);
    printf("\n");
}

static void dump_block ( PLpgSQL_stmt_block block  )  [static]

Definition at line 837 of file pl_funcs.c.

References PLpgSQL_exception::action, PLpgSQL_stmt_block::body, PLpgSQL_exception::conditions, PLpgSQL_condition::condname, dump_ind(), dump_stmts(), PLpgSQL_exception_block::exc_list, PLpgSQL_stmt_block::exceptions, PLpgSQL_stmt_block::label, lfirst, name, PLpgSQL_condition::next, and NULL.

Referenced by dump_stmt(), and plpgsql_dumptree().

{
    char       *name;

    if (block->label == NULL)
        name = "*unnamed*";
    else
        name = block->label;

    dump_ind();
    printf("BLOCK <<%s>>\n", name);

    dump_stmts(block->body);

    if (block->exceptions)
    {
        ListCell   *e;

        foreach(e, block->exceptions->exc_list)
        {
            PLpgSQL_exception *exc = (PLpgSQL_exception *) lfirst(e);
            PLpgSQL_condition *cond;

            dump_ind();
            printf("    EXCEPTION WHEN ");
            for (cond = exc->conditions; cond; cond = cond->next)
            {
                if (cond != exc->conditions)
                    printf(" OR ");
                printf("%s", cond->condname);
            }
            printf(" THEN\n");
            dump_stmts(exc->action);
        }
    }

    dump_ind();
    printf("    END -- %s\n", name);
}

static void dump_case ( PLpgSQL_stmt_case stmt  )  [static]

Definition at line 917 of file pl_funcs.c.

References PLpgSQL_stmt_case::case_when_list, dump_expr(), dump_ind(), dump_indent, dump_stmts(), PLpgSQL_stmt_case::else_stmts, PLpgSQL_case_when::expr, PLpgSQL_stmt_case::have_else, lfirst, PLpgSQL_case_when::stmts, PLpgSQL_stmt_case::t_expr, and PLpgSQL_stmt_case::t_varno.

Referenced by dump_stmt().

{
    ListCell   *l;

    dump_ind();
    printf("CASE %d ", stmt->t_varno);
    if (stmt->t_expr)
        dump_expr(stmt->t_expr);
    printf("\n");
    dump_indent += 6;
    foreach(l, stmt->case_when_list)
    {
        PLpgSQL_case_when *cwt = (PLpgSQL_case_when *) lfirst(l);

        dump_ind();
        printf("WHEN ");
        dump_expr(cwt->expr);
        printf("\n");
        dump_ind();
        printf("THEN\n");
        dump_indent += 2;
        dump_stmts(cwt->stmts);
        dump_indent -= 2;
    }
    if (stmt->have_else)
    {
        dump_ind();
        printf("ELSE\n");
        dump_indent += 2;
        dump_stmts(stmt->else_stmts);
        dump_indent -= 2;
    }
    dump_indent -= 6;
    dump_ind();
    printf("    ENDCASE\n");
}

static void dump_close ( PLpgSQL_stmt_close stmt  )  [static]

Definition at line 1180 of file pl_funcs.c.

References PLpgSQL_stmt_close::curvar, and dump_ind().

Referenced by dump_stmt().

{
    dump_ind();
    printf("CLOSE curvar=%d\n", stmt->curvar);
}

static void dump_cursor_direction ( PLpgSQL_stmt_fetch stmt  )  [static]

Definition at line 1146 of file pl_funcs.c.

References PLpgSQL_stmt_fetch::direction, dump_expr(), dump_ind(), dump_indent, PLpgSQL_stmt_fetch::expr, FETCH_ABSOLUTE, FETCH_BACKWARD, FETCH_FORWARD, FETCH_RELATIVE, and PLpgSQL_stmt_fetch::how_many.

Referenced by dump_fetch().

{
    dump_indent += 2;
    dump_ind();
    switch (stmt->direction)
    {
        case FETCH_FORWARD:
            printf("    FORWARD ");
            break;
        case FETCH_BACKWARD:
            printf("    BACKWARD ");
            break;
        case FETCH_ABSOLUTE:
            printf("    ABSOLUTE ");
            break;
        case FETCH_RELATIVE:
            printf("    RELATIVE ");
            break;
        default:
            printf("??? unknown cursor direction %d", stmt->direction);
    }

    if (stmt->expr)
    {
        dump_expr(stmt->expr);
        printf("\n");
    }
    else
        printf("%ld\n", stmt->how_many);

    dump_indent -= 2;
}

static void dump_dynexecute ( PLpgSQL_stmt_dynexecute stmt  )  [static]

Definition at line 1356 of file pl_funcs.c.

References PLpgSQL_row::dno, PLpgSQL_rec::dno, dump_expr(), dump_ind(), dump_indent, i, lfirst, NIL, NULL, PLpgSQL_stmt_dynexecute::params, PLpgSQL_stmt_dynexecute::query, PLpgSQL_stmt_dynexecute::rec, PLpgSQL_row::refname, PLpgSQL_rec::refname, PLpgSQL_stmt_dynexecute::row, and PLpgSQL_stmt_dynexecute::strict.

Referenced by dump_stmt().

{
    dump_ind();
    printf("EXECUTE ");
    dump_expr(stmt->query);
    printf("\n");

    dump_indent += 2;
    if (stmt->rec != NULL)
    {
        dump_ind();
        printf("    INTO%s target = %d %s\n",
               stmt->strict ? " STRICT" : "",
               stmt->rec->dno, stmt->rec->refname);
    }
    if (stmt->row != NULL)
    {
        dump_ind();
        printf("    INTO%s target = %d %s\n",
               stmt->strict ? " STRICT" : "",
               stmt->row->dno, stmt->row->refname);
    }
    if (stmt->params != NIL)
    {
        ListCell   *lc;
        int         i;

        dump_ind();
        printf("    USING\n");
        dump_indent += 2;
        i = 1;
        foreach(lc, stmt->params)
        {
            dump_ind();
            printf("    parameter %d: ", i++);
            dump_expr((PLpgSQL_expr *) lfirst(lc));
            printf("\n");
        }
        dump_indent -= 2;
    }
    dump_indent -= 2;
}

static void dump_dynfors ( PLpgSQL_stmt_dynfors stmt  )  [static]

Definition at line 1400 of file pl_funcs.c.

References PLpgSQL_stmt_dynfors::body, dump_expr(), dump_ind(), dump_indent, dump_stmts(), i, lfirst, NIL, NULL, PLpgSQL_stmt_dynfors::params, PLpgSQL_stmt_dynfors::query, PLpgSQL_stmt_dynfors::rec, PLpgSQL_row::refname, PLpgSQL_rec::refname, and PLpgSQL_stmt_dynfors::row.

Referenced by dump_stmt().

{
    dump_ind();
    printf("FORS %s EXECUTE ",
           (stmt->rec != NULL) ? stmt->rec->refname : stmt->row->refname);
    dump_expr(stmt->query);
    printf("\n");
    if (stmt->params != NIL)
    {
        ListCell   *lc;
        int         i;

        dump_indent += 2;
        dump_ind();
        printf("    USING\n");
        dump_indent += 2;
        i = 1;
        foreach(lc, stmt->params)
        {
            dump_ind();
            printf("    parameter $%d: ", i++);
            dump_expr((PLpgSQL_expr *) lfirst(lc));
            printf("\n");
        }
        dump_indent -= 4;
    }
    dump_stmts(stmt->body);
    dump_ind();
    printf("    ENDFORS\n");
}

static void dump_execsql ( PLpgSQL_stmt_execsql stmt  )  [static]

Definition at line 1330 of file pl_funcs.c.

References PLpgSQL_row::dno, PLpgSQL_rec::dno, dump_expr(), dump_ind(), dump_indent, NULL, PLpgSQL_stmt_execsql::rec, PLpgSQL_row::refname, PLpgSQL_rec::refname, PLpgSQL_stmt_execsql::row, PLpgSQL_stmt_execsql::sqlstmt, and PLpgSQL_stmt_execsql::strict.

Referenced by dump_stmt().

{
    dump_ind();
    printf("EXECSQL ");
    dump_expr(stmt->sqlstmt);
    printf("\n");

    dump_indent += 2;
    if (stmt->rec != NULL)
    {
        dump_ind();
        printf("    INTO%s target = %d %s\n",
               stmt->strict ? " STRICT" : "",
               stmt->rec->dno, stmt->rec->refname);
    }
    if (stmt->row != NULL)
    {
        dump_ind();
        printf("    INTO%s target = %d %s\n",
               stmt->strict ? " STRICT" : "",
               stmt->row->dno, stmt->row->refname);
    }
    dump_indent -= 2;
}

static void dump_exit ( PLpgSQL_stmt_exit stmt  )  [static]

Definition at line 1196 of file pl_funcs.c.

References PLpgSQL_stmt_exit::cond, dump_expr(), dump_ind(), PLpgSQL_stmt_exit::is_exit, PLpgSQL_stmt_exit::label, and NULL.

Referenced by dump_stmt().

{
    dump_ind();
    printf("%s", stmt->is_exit ? "EXIT" : "CONTINUE");
    if (stmt->label != NULL)
        printf(" label='%s'", stmt->label);
    if (stmt->cond != NULL)
    {
        printf(" WHEN ");
        dump_expr(stmt->cond);
    }
    printf("\n");
}

static void dump_expr ( PLpgSQL_expr expr  )  [static]
static void dump_fetch ( PLpgSQL_stmt_fetch stmt  )  [static]

Definition at line 1116 of file pl_funcs.c.

References PLpgSQL_stmt_fetch::curvar, PLpgSQL_row::dno, PLpgSQL_rec::dno, dump_cursor_direction(), dump_ind(), dump_indent, PLpgSQL_stmt_fetch::is_move, NULL, PLpgSQL_stmt_fetch::rec, PLpgSQL_row::refname, PLpgSQL_rec::refname, and PLpgSQL_stmt_fetch::row.

Referenced by dump_stmt().

{
    dump_ind();

    if (!stmt->is_move)
    {
        printf("FETCH curvar=%d\n", stmt->curvar);
        dump_cursor_direction(stmt);

        dump_indent += 2;
        if (stmt->rec != NULL)
        {
            dump_ind();
            printf("    target = %d %s\n", stmt->rec->dno, stmt->rec->refname);
        }
        if (stmt->row != NULL)
        {
            dump_ind();
            printf("    target = %d %s\n", stmt->row->dno, stmt->row->refname);
        }
        dump_indent -= 2;
    }
    else
    {
        printf("MOVE curvar=%d\n", stmt->curvar);
        dump_cursor_direction(stmt);
    }
}

static void dump_forc ( PLpgSQL_stmt_forc stmt  )  [static]

Definition at line 1025 of file pl_funcs.c.

References PLpgSQL_stmt_forc::argquery, PLpgSQL_stmt_forc::body, PLpgSQL_stmt_forc::curvar, dump_expr(), dump_ind(), dump_indent, dump_stmts(), NULL, PLpgSQL_stmt_forc::rec, and PLpgSQL_rec::refname.

Referenced by dump_stmt().

{
    dump_ind();
    printf("FORC %s ", stmt->rec->refname);
    printf("curvar=%d\n", stmt->curvar);

    dump_indent += 2;
    if (stmt->argquery != NULL)
    {
        dump_ind();
        printf("  arguments = ");
        dump_expr(stmt->argquery);
        printf("\n");
    }
    dump_indent -= 2;

    dump_stmts(stmt->body);

    dump_ind();
    printf("    ENDFORC\n");
}

static void dump_foreach_a ( PLpgSQL_stmt_foreach_a stmt  )  [static]

Definition at line 1048 of file pl_funcs.c.

References PLpgSQL_stmt_foreach_a::body, dump_expr(), dump_ind(), dump_stmts(), PLpgSQL_stmt_foreach_a::expr, PLpgSQL_stmt_foreach_a::slice, and PLpgSQL_stmt_foreach_a::varno.

Referenced by dump_stmt().

{
    dump_ind();
    printf("FOREACHA var %d ", stmt->varno);
    if (stmt->slice != 0)
        printf("SLICE %d ", stmt->slice);
    printf("IN ");
    dump_expr(stmt->expr);
    printf("\n");

    dump_stmts(stmt->body);

    dump_ind();
    printf("    ENDFOREACHA");
}

static void dump_fori ( PLpgSQL_stmt_fori stmt  )  [static]

Definition at line 981 of file pl_funcs.c.

References PLpgSQL_stmt_fori::body, dump_expr(), dump_ind(), dump_indent, dump_stmts(), PLpgSQL_stmt_fori::lower, PLpgSQL_var::refname, PLpgSQL_stmt_fori::reverse, PLpgSQL_stmt_fori::step, PLpgSQL_stmt_fori::upper, and PLpgSQL_stmt_fori::var.

Referenced by dump_stmt().

{
    dump_ind();
    printf("FORI %s %s\n", stmt->var->refname, (stmt->reverse) ? "REVERSE" : "NORMAL");

    dump_indent += 2;
    dump_ind();
    printf("    lower = ");
    dump_expr(stmt->lower);
    printf("\n");
    dump_ind();
    printf("    upper = ");
    dump_expr(stmt->upper);
    printf("\n");
    if (stmt->step)
    {
        dump_ind();
        printf("    step = ");
        dump_expr(stmt->step);
        printf("\n");
    }
    dump_indent -= 2;

    dump_stmts(stmt->body);

    dump_ind();
    printf("    ENDFORI\n");
}

static void dump_fors ( PLpgSQL_stmt_fors stmt  )  [static]

Definition at line 1011 of file pl_funcs.c.

References PLpgSQL_stmt_fors::body, dump_expr(), dump_ind(), dump_stmts(), NULL, PLpgSQL_stmt_fors::query, PLpgSQL_stmt_fors::rec, PLpgSQL_row::refname, PLpgSQL_rec::refname, and PLpgSQL_stmt_fors::row.

Referenced by dump_stmt().

{
    dump_ind();
    printf("FORS %s ", (stmt->rec != NULL) ? stmt->rec->refname : stmt->row->refname);
    dump_expr(stmt->query);
    printf("\n");

    dump_stmts(stmt->body);

    dump_ind();
    printf("    ENDFORS\n");
}

static void dump_getdiag ( PLpgSQL_stmt_getdiag stmt  )  [static]

Definition at line 1432 of file pl_funcs.c.

References PLpgSQL_stmt_getdiag::diag_items, dump_ind(), PLpgSQL_stmt_getdiag::is_stacked, PLpgSQL_diag_item::kind, lfirst, list_head(), plpgsql_getdiag_kindname(), and PLpgSQL_diag_item::target.

Referenced by dump_stmt().

{
    ListCell   *lc;

    dump_ind();
    printf("GET %s DIAGNOSTICS ", stmt->is_stacked ? "STACKED" : "CURRENT");
    foreach(lc, stmt->diag_items)
    {
        PLpgSQL_diag_item *diag_item = (PLpgSQL_diag_item *) lfirst(lc);

        if (lc != list_head(stmt->diag_items))
            printf(", ");

        printf("{var %d} = %s", diag_item->target,
               plpgsql_getdiag_kindname(diag_item->kind));
    }
    printf("\n");
}

static void dump_if ( PLpgSQL_stmt_if stmt  )  [static]

Definition at line 887 of file pl_funcs.c.

References PLpgSQL_if_elsif::cond, PLpgSQL_stmt_if::cond, dump_expr(), dump_ind(), dump_stmts(), PLpgSQL_stmt_if::else_body, PLpgSQL_stmt_if::elsif_list, lfirst, NIL, PLpgSQL_if_elsif::stmts, and PLpgSQL_stmt_if::then_body.

Referenced by dump_stmt().

{
    ListCell   *l;

    dump_ind();
    printf("IF ");
    dump_expr(stmt->cond);
    printf(" THEN\n");
    dump_stmts(stmt->then_body);
    foreach(l, stmt->elsif_list)
    {
        PLpgSQL_if_elsif *elif = (PLpgSQL_if_elsif *) lfirst(l);

        dump_ind();
        printf("    ELSIF ");
        dump_expr(elif->cond);
        printf(" THEN\n");
        dump_stmts(elif->stmts);
    }
    if (stmt->else_body != NIL)
    {
        dump_ind();
        printf("    ELSE\n");
        dump_stmts(stmt->else_body);
    }
    dump_ind();
    printf("    ENDIF\n");
}

static void dump_ind ( void   )  [static]
static void dump_loop ( PLpgSQL_stmt_loop stmt  )  [static]

Definition at line 955 of file pl_funcs.c.

References PLpgSQL_stmt_loop::body, dump_ind(), and dump_stmts().

Referenced by dump_stmt().

{
    dump_ind();
    printf("LOOP\n");

    dump_stmts(stmt->body);

    dump_ind();
    printf("    ENDLOOP\n");
}

static void dump_open ( PLpgSQL_stmt_open stmt  )  [static]

Definition at line 1065 of file pl_funcs.c.

References PLpgSQL_stmt_open::argquery, PLpgSQL_stmt_open::curvar, dump_expr(), dump_ind(), dump_indent, PLpgSQL_stmt_open::dynquery, i, lfirst, NIL, NULL, PLpgSQL_stmt_open::params, and PLpgSQL_stmt_open::query.

Referenced by dump_stmt().

{
    dump_ind();
    printf("OPEN curvar=%d\n", stmt->curvar);

    dump_indent += 2;
    if (stmt->argquery != NULL)
    {
        dump_ind();
        printf("  arguments = '");
        dump_expr(stmt->argquery);
        printf("'\n");
    }
    if (stmt->query != NULL)
    {
        dump_ind();
        printf("  query = '");
        dump_expr(stmt->query);
        printf("'\n");
    }
    if (stmt->dynquery != NULL)
    {
        dump_ind();
        printf("  execute = '");
        dump_expr(stmt->dynquery);
        printf("'\n");

        if (stmt->params != NIL)
        {
            ListCell   *lc;
            int         i;

            dump_indent += 2;
            dump_ind();
            printf("    USING\n");
            dump_indent += 2;
            i = 1;
            foreach(lc, stmt->params)
            {
                dump_ind();
                printf("    parameter $%d: ", i++);
                dump_expr((PLpgSQL_expr *) lfirst(lc));
                printf("\n");
            }
            dump_indent -= 4;
        }
    }
    dump_indent -= 2;
}

static void dump_perform ( PLpgSQL_stmt_perform stmt  )  [static]

Definition at line 1187 of file pl_funcs.c.

References dump_expr(), dump_ind(), and PLpgSQL_stmt_perform::expr.

Referenced by dump_stmt().

{
    dump_ind();
    printf("PERFORM expr = ");
    dump_expr(stmt->expr);
    printf("\n");
}

static void dump_raise ( PLpgSQL_stmt_raise stmt  )  [static]

Definition at line 1276 of file pl_funcs.c.

References PLpgSQL_stmt_raise::condname, dump_expr(), dump_ind(), dump_indent, PLpgSQL_stmt_raise::elog_level, PLpgSQL_raise_option::expr, i, lfirst, PLpgSQL_stmt_raise::message, PLpgSQL_raise_option::opt_type, PLpgSQL_stmt_raise::options, PLpgSQL_stmt_raise::params, PLPGSQL_RAISEOPTION_DETAIL, PLPGSQL_RAISEOPTION_ERRCODE, PLPGSQL_RAISEOPTION_HINT, and PLPGSQL_RAISEOPTION_MESSAGE.

Referenced by dump_stmt().

{
    ListCell   *lc;
    int         i = 0;

    dump_ind();
    printf("RAISE level=%d", stmt->elog_level);
    if (stmt->condname)
        printf(" condname='%s'", stmt->condname);
    if (stmt->message)
        printf(" message='%s'", stmt->message);
    printf("\n");
    dump_indent += 2;
    foreach(lc, stmt->params)
    {
        dump_ind();
        printf("    parameter %d: ", i++);
        dump_expr((PLpgSQL_expr *) lfirst(lc));
        printf("\n");
    }
    if (stmt->options)
    {
        dump_ind();
        printf("    USING\n");
        dump_indent += 2;
        foreach(lc, stmt->options)
        {
            PLpgSQL_raise_option *opt = (PLpgSQL_raise_option *) lfirst(lc);

            dump_ind();
            switch (opt->opt_type)
            {
                case PLPGSQL_RAISEOPTION_ERRCODE:
                    printf("    ERRCODE = ");
                    break;
                case PLPGSQL_RAISEOPTION_MESSAGE:
                    printf("    MESSAGE = ");
                    break;
                case PLPGSQL_RAISEOPTION_DETAIL:
                    printf("    DETAIL = ");
                    break;
                case PLPGSQL_RAISEOPTION_HINT:
                    printf("    HINT = ");
                    break;
            }
            dump_expr(opt->expr);
            printf("\n");
        }
        dump_indent -= 2;
    }
    dump_indent -= 2;
}

static void dump_return ( PLpgSQL_stmt_return stmt  )  [static]

Definition at line 1211 of file pl_funcs.c.

References dump_expr(), dump_ind(), PLpgSQL_stmt_return::expr, NULL, and PLpgSQL_stmt_return::retvarno.

Referenced by dump_stmt().

{
    dump_ind();
    printf("RETURN ");
    if (stmt->retvarno >= 0)
        printf("variable %d", stmt->retvarno);
    else if (stmt->expr != NULL)
        dump_expr(stmt->expr);
    else
        printf("NULL");
    printf("\n");
}

static void dump_return_next ( PLpgSQL_stmt_return_next stmt  )  [static]

Definition at line 1225 of file pl_funcs.c.

References dump_expr(), dump_ind(), PLpgSQL_stmt_return_next::expr, NULL, and PLpgSQL_stmt_return_next::retvarno.

Referenced by dump_stmt().

{
    dump_ind();
    printf("RETURN NEXT ");
    if (stmt->retvarno >= 0)
        printf("variable %d", stmt->retvarno);
    else if (stmt->expr != NULL)
        dump_expr(stmt->expr);
    else
        printf("NULL");
    printf("\n");
}

static void dump_return_query ( PLpgSQL_stmt_return_query stmt  )  [static]

Definition at line 1239 of file pl_funcs.c.

References dump_expr(), dump_ind(), dump_indent, PLpgSQL_stmt_return_query::dynquery, i, lfirst, NIL, PLpgSQL_stmt_return_query::params, and PLpgSQL_stmt_return_query::query.

Referenced by dump_stmt().

{
    dump_ind();
    if (stmt->query)
    {
        printf("RETURN QUERY ");
        dump_expr(stmt->query);
        printf("\n");
    }
    else
    {
        printf("RETURN QUERY EXECUTE ");
        dump_expr(stmt->dynquery);
        printf("\n");
        if (stmt->params != NIL)
        {
            ListCell   *lc;
            int         i;

            dump_indent += 2;
            dump_ind();
            printf("    USING\n");
            dump_indent += 2;
            i = 1;
            foreach(lc, stmt->params)
            {
                dump_ind();
                printf("    parameter $%d: ", i++);
                dump_expr((PLpgSQL_expr *) lfirst(lc));
                printf("\n");
            }
            dump_indent -= 4;
        }
    }
}

static void dump_stmt ( PLpgSQL_stmt stmt  )  [static]

Definition at line 745 of file pl_funcs.c.

References PLpgSQL_stmt_perform::cmd_type, PLpgSQL_stmt::cmd_type, dump_assign(), dump_block(), dump_case(), dump_close(), dump_dynexecute(), dump_dynfors(), dump_execsql(), dump_exit(), dump_fetch(), dump_forc(), dump_foreach_a(), dump_fori(), dump_fors(), dump_getdiag(), dump_if(), dump_loop(), dump_open(), dump_perform(), dump_raise(), dump_return(), dump_return_next(), dump_return_query(), dump_while(), elog, ERROR, PLpgSQL_stmt::lineno, PLPGSQL_STMT_ASSIGN, PLPGSQL_STMT_BLOCK, PLPGSQL_STMT_CASE, PLPGSQL_STMT_CLOSE, PLPGSQL_STMT_DYNEXECUTE, PLPGSQL_STMT_DYNFORS, PLPGSQL_STMT_EXECSQL, PLPGSQL_STMT_EXIT, PLPGSQL_STMT_FETCH, PLPGSQL_STMT_FORC, PLPGSQL_STMT_FOREACH_A, PLPGSQL_STMT_FORI, PLPGSQL_STMT_FORS, PLPGSQL_STMT_GETDIAG, PLPGSQL_STMT_IF, PLPGSQL_STMT_LOOP, PLPGSQL_STMT_OPEN, PLPGSQL_STMT_PERFORM, PLPGSQL_STMT_RAISE, PLPGSQL_STMT_RETURN, PLPGSQL_STMT_RETURN_NEXT, PLPGSQL_STMT_RETURN_QUERY, and PLPGSQL_STMT_WHILE.

Referenced by dump_stmts().

{
    printf("%3d:", stmt->lineno);
    switch ((enum PLpgSQL_stmt_types) stmt->cmd_type)
    {
        case PLPGSQL_STMT_BLOCK:
            dump_block((PLpgSQL_stmt_block *) stmt);
            break;
        case PLPGSQL_STMT_ASSIGN:
            dump_assign((PLpgSQL_stmt_assign *) stmt);
            break;
        case PLPGSQL_STMT_IF:
            dump_if((PLpgSQL_stmt_if *) stmt);
            break;
        case PLPGSQL_STMT_CASE:
            dump_case((PLpgSQL_stmt_case *) stmt);
            break;
        case PLPGSQL_STMT_LOOP:
            dump_loop((PLpgSQL_stmt_loop *) stmt);
            break;
        case PLPGSQL_STMT_WHILE:
            dump_while((PLpgSQL_stmt_while *) stmt);
            break;
        case PLPGSQL_STMT_FORI:
            dump_fori((PLpgSQL_stmt_fori *) stmt);
            break;
        case PLPGSQL_STMT_FORS:
            dump_fors((PLpgSQL_stmt_fors *) stmt);
            break;
        case PLPGSQL_STMT_FORC:
            dump_forc((PLpgSQL_stmt_forc *) stmt);
            break;
        case PLPGSQL_STMT_FOREACH_A:
            dump_foreach_a((PLpgSQL_stmt_foreach_a *) stmt);
            break;
        case PLPGSQL_STMT_EXIT:
            dump_exit((PLpgSQL_stmt_exit *) stmt);
            break;
        case PLPGSQL_STMT_RETURN:
            dump_return((PLpgSQL_stmt_return *) stmt);
            break;
        case PLPGSQL_STMT_RETURN_NEXT:
            dump_return_next((PLpgSQL_stmt_return_next *) stmt);
            break;
        case PLPGSQL_STMT_RETURN_QUERY:
            dump_return_query((PLpgSQL_stmt_return_query *) stmt);
            break;
        case PLPGSQL_STMT_RAISE:
            dump_raise((PLpgSQL_stmt_raise *) stmt);
            break;
        case PLPGSQL_STMT_EXECSQL:
            dump_execsql((PLpgSQL_stmt_execsql *) stmt);
            break;
        case PLPGSQL_STMT_DYNEXECUTE:
            dump_dynexecute((PLpgSQL_stmt_dynexecute *) stmt);
            break;
        case PLPGSQL_STMT_DYNFORS:
            dump_dynfors((PLpgSQL_stmt_dynfors *) stmt);
            break;
        case PLPGSQL_STMT_GETDIAG:
            dump_getdiag((PLpgSQL_stmt_getdiag *) stmt);
            break;
        case PLPGSQL_STMT_OPEN:
            dump_open((PLpgSQL_stmt_open *) stmt);
            break;
        case PLPGSQL_STMT_FETCH:
            dump_fetch((PLpgSQL_stmt_fetch *) stmt);
            break;
        case PLPGSQL_STMT_CLOSE:
            dump_close((PLpgSQL_stmt_close *) stmt);
            break;
        case PLPGSQL_STMT_PERFORM:
            dump_perform((PLpgSQL_stmt_perform *) stmt);
            break;
        default:
            elog(ERROR, "unrecognized cmd_type: %d", stmt->cmd_type);
            break;
    }
}

static void dump_stmts ( List stmts  )  [static]
static void dump_while ( PLpgSQL_stmt_while stmt  )  [static]

Definition at line 967 of file pl_funcs.c.

References PLpgSQL_stmt_while::body, PLpgSQL_stmt_while::cond, dump_expr(), dump_ind(), and dump_stmts().

Referenced by dump_stmt().

{
    dump_ind();
    printf("WHILE ");
    dump_expr(stmt->cond);
    printf("\n");

    dump_stmts(stmt->body);

    dump_ind();
    printf("    ENDWHILE\n");
}

static void free_assign ( PLpgSQL_stmt_assign stmt  )  [static]

Definition at line 441 of file pl_funcs.c.

References PLpgSQL_stmt_assign::expr, and free_expr().

Referenced by free_stmt().

{
    free_expr(stmt->expr);
}

static void free_block ( PLpgSQL_stmt_block block  )  [static]
static void free_case ( PLpgSQL_stmt_case stmt  )  [static]
static void free_close ( PLpgSQL_stmt_close stmt  )  [static]

Definition at line 543 of file pl_funcs.c.

Referenced by free_stmt().

{
}

static void free_dynexecute ( PLpgSQL_stmt_dynexecute stmt  )  [static]

Definition at line 608 of file pl_funcs.c.

References free_expr(), lfirst, PLpgSQL_stmt_dynexecute::params, and PLpgSQL_stmt_dynexecute::query.

Referenced by free_stmt().

{
    ListCell   *lc;

    free_expr(stmt->query);
    foreach(lc, stmt->params)
    {
        free_expr((PLpgSQL_expr *) lfirst(lc));
    }
}

static void free_dynfors ( PLpgSQL_stmt_dynfors stmt  )  [static]

Definition at line 620 of file pl_funcs.c.

References PLpgSQL_stmt_dynfors::body, free_expr(), free_stmts(), lfirst, PLpgSQL_stmt_dynfors::params, and PLpgSQL_stmt_dynfors::query.

Referenced by free_stmt().

{
    ListCell   *lc;

    free_stmts(stmt->body);
    free_expr(stmt->query);
    foreach(lc, stmt->params)
    {
        free_expr((PLpgSQL_expr *) lfirst(lc));
    }
}

static void free_execsql ( PLpgSQL_stmt_execsql stmt  )  [static]

Definition at line 602 of file pl_funcs.c.

References free_expr(), and PLpgSQL_stmt_execsql::sqlstmt.

Referenced by free_stmt().

{
    free_expr(stmt->sqlstmt);
}

static void free_exit ( PLpgSQL_stmt_exit stmt  )  [static]

Definition at line 554 of file pl_funcs.c.

References PLpgSQL_stmt_exit::cond, and free_expr().

Referenced by free_stmt().

{
    free_expr(stmt->cond);
}

static void free_expr ( PLpgSQL_expr expr  )  [static]
static void free_fetch ( PLpgSQL_stmt_fetch stmt  )  [static]

Definition at line 537 of file pl_funcs.c.

References PLpgSQL_stmt_fetch::expr, and free_expr().

Referenced by free_stmt().

{
    free_expr(stmt->expr);
}

static void free_forc ( PLpgSQL_stmt_forc stmt  )  [static]

Definition at line 509 of file pl_funcs.c.

References PLpgSQL_stmt_forc::argquery, PLpgSQL_stmt_forc::body, free_expr(), and free_stmts().

Referenced by free_stmt().

{
    free_stmts(stmt->body);
    free_expr(stmt->argquery);
}

static void free_foreach_a ( PLpgSQL_stmt_foreach_a stmt  )  [static]

Definition at line 516 of file pl_funcs.c.

References PLpgSQL_stmt_foreach_a::body, PLpgSQL_stmt_foreach_a::expr, free_expr(), and free_stmts().

Referenced by free_stmt().

{
    free_expr(stmt->expr);
    free_stmts(stmt->body);
}

static void free_fori ( PLpgSQL_stmt_fori stmt  )  [static]
static void free_fors ( PLpgSQL_stmt_fors stmt  )  [static]

Definition at line 502 of file pl_funcs.c.

References PLpgSQL_stmt_fors::body, free_expr(), free_stmts(), and PLpgSQL_stmt_fors::query.

Referenced by free_stmt().

{
    free_stmts(stmt->body);
    free_expr(stmt->query);
}

static void free_getdiag ( PLpgSQL_stmt_getdiag stmt  )  [static]

Definition at line 633 of file pl_funcs.c.

Referenced by free_stmt().

{
}

static void free_if ( PLpgSQL_stmt_if stmt  )  [static]
static void free_loop ( PLpgSQL_stmt_loop stmt  )  [static]

Definition at line 480 of file pl_funcs.c.

References PLpgSQL_stmt_loop::body, and free_stmts().

Referenced by free_stmt().

{
    free_stmts(stmt->body);
}

static void free_open ( PLpgSQL_stmt_open stmt  )  [static]
static void free_perform ( PLpgSQL_stmt_perform stmt  )  [static]

Definition at line 548 of file pl_funcs.c.

References PLpgSQL_stmt_perform::expr, and free_expr().

Referenced by free_stmt().

{
    free_expr(stmt->expr);
}

static void free_raise ( PLpgSQL_stmt_raise stmt  )  [static]

Definition at line 585 of file pl_funcs.c.

References PLpgSQL_raise_option::expr, free_expr(), lfirst, PLpgSQL_stmt_raise::options, and PLpgSQL_stmt_raise::params.

Referenced by free_stmt().

{
    ListCell   *lc;

    foreach(lc, stmt->params)
    {
        free_expr((PLpgSQL_expr *) lfirst(lc));
    }
    foreach(lc, stmt->options)
    {
        PLpgSQL_raise_option *opt = (PLpgSQL_raise_option *) lfirst(lc);

        free_expr(opt->expr);
    }
}

static void free_return ( PLpgSQL_stmt_return stmt  )  [static]

Definition at line 560 of file pl_funcs.c.

References PLpgSQL_stmt_return::expr, and free_expr().

Referenced by free_stmt().

{
    free_expr(stmt->expr);
}

static void free_return_next ( PLpgSQL_stmt_return_next stmt  )  [static]

Definition at line 566 of file pl_funcs.c.

References PLpgSQL_stmt_return_next::expr, and free_expr().

Referenced by free_stmt().

{
    free_expr(stmt->expr);
}

static void free_return_query ( PLpgSQL_stmt_return_query stmt  )  [static]
static void free_stmt ( PLpgSQL_stmt stmt  )  [static]

Definition at line 333 of file pl_funcs.c.

References PLpgSQL_stmt_perform::cmd_type, PLpgSQL_stmt::cmd_type, elog, ERROR, free_assign(), free_block(), free_case(), free_close(), free_dynexecute(), free_dynfors(), free_execsql(), free_exit(), free_fetch(), free_forc(), free_foreach_a(), free_fori(), free_fors(), free_getdiag(), free_if(), free_loop(), free_open(), free_perform(), free_raise(), free_return(), free_return_next(), free_return_query(), free_while(), PLPGSQL_STMT_ASSIGN, PLPGSQL_STMT_BLOCK, PLPGSQL_STMT_CASE, PLPGSQL_STMT_CLOSE, PLPGSQL_STMT_DYNEXECUTE, PLPGSQL_STMT_DYNFORS, PLPGSQL_STMT_EXECSQL, PLPGSQL_STMT_EXIT, PLPGSQL_STMT_FETCH, PLPGSQL_STMT_FORC, PLPGSQL_STMT_FOREACH_A, PLPGSQL_STMT_FORI, PLPGSQL_STMT_FORS, PLPGSQL_STMT_GETDIAG, PLPGSQL_STMT_IF, PLPGSQL_STMT_LOOP, PLPGSQL_STMT_OPEN, PLPGSQL_STMT_PERFORM, PLPGSQL_STMT_RAISE, PLPGSQL_STMT_RETURN, PLPGSQL_STMT_RETURN_NEXT, PLPGSQL_STMT_RETURN_QUERY, and PLPGSQL_STMT_WHILE.

Referenced by free_stmts().

{
    switch ((enum PLpgSQL_stmt_types) stmt->cmd_type)
    {
        case PLPGSQL_STMT_BLOCK:
            free_block((PLpgSQL_stmt_block *) stmt);
            break;
        case PLPGSQL_STMT_ASSIGN:
            free_assign((PLpgSQL_stmt_assign *) stmt);
            break;
        case PLPGSQL_STMT_IF:
            free_if((PLpgSQL_stmt_if *) stmt);
            break;
        case PLPGSQL_STMT_CASE:
            free_case((PLpgSQL_stmt_case *) stmt);
            break;
        case PLPGSQL_STMT_LOOP:
            free_loop((PLpgSQL_stmt_loop *) stmt);
            break;
        case PLPGSQL_STMT_WHILE:
            free_while((PLpgSQL_stmt_while *) stmt);
            break;
        case PLPGSQL_STMT_FORI:
            free_fori((PLpgSQL_stmt_fori *) stmt);
            break;
        case PLPGSQL_STMT_FORS:
            free_fors((PLpgSQL_stmt_fors *) stmt);
            break;
        case PLPGSQL_STMT_FORC:
            free_forc((PLpgSQL_stmt_forc *) stmt);
            break;
        case PLPGSQL_STMT_FOREACH_A:
            free_foreach_a((PLpgSQL_stmt_foreach_a *) stmt);
            break;
        case PLPGSQL_STMT_EXIT:
            free_exit((PLpgSQL_stmt_exit *) stmt);
            break;
        case PLPGSQL_STMT_RETURN:
            free_return((PLpgSQL_stmt_return *) stmt);
            break;
        case PLPGSQL_STMT_RETURN_NEXT:
            free_return_next((PLpgSQL_stmt_return_next *) stmt);
            break;
        case PLPGSQL_STMT_RETURN_QUERY:
            free_return_query((PLpgSQL_stmt_return_query *) stmt);
            break;
        case PLPGSQL_STMT_RAISE:
            free_raise((PLpgSQL_stmt_raise *) stmt);
            break;
        case PLPGSQL_STMT_EXECSQL:
            free_execsql((PLpgSQL_stmt_execsql *) stmt);
            break;
        case PLPGSQL_STMT_DYNEXECUTE:
            free_dynexecute((PLpgSQL_stmt_dynexecute *) stmt);
            break;
        case PLPGSQL_STMT_DYNFORS:
            free_dynfors((PLpgSQL_stmt_dynfors *) stmt);
            break;
        case PLPGSQL_STMT_GETDIAG:
            free_getdiag((PLpgSQL_stmt_getdiag *) stmt);
            break;
        case PLPGSQL_STMT_OPEN:
            free_open((PLpgSQL_stmt_open *) stmt);
            break;
        case PLPGSQL_STMT_FETCH:
            free_fetch((PLpgSQL_stmt_fetch *) stmt);
            break;
        case PLPGSQL_STMT_CLOSE:
            free_close((PLpgSQL_stmt_close *) stmt);
            break;
        case PLPGSQL_STMT_PERFORM:
            free_perform((PLpgSQL_stmt_perform *) stmt);
            break;
        default:
            elog(ERROR, "unrecognized cmd_type: %d", stmt->cmd_type);
            break;
    }
}

static void free_stmts ( List stmts  )  [static]

Definition at line 413 of file pl_funcs.c.

References free_stmt(), and lfirst.

Referenced by free_block(), free_case(), free_dynfors(), free_forc(), free_foreach_a(), free_fori(), free_fors(), free_if(), free_loop(), and free_while().

{
    ListCell   *s;

    foreach(s, stmts)
    {
        free_stmt((PLpgSQL_stmt *) lfirst(s));
    }
}

static void free_while ( PLpgSQL_stmt_while stmt  )  [static]

Definition at line 486 of file pl_funcs.c.

References PLpgSQL_stmt_while::body, PLpgSQL_stmt_while::cond, free_expr(), and free_stmts().

Referenced by free_stmt().

{
    free_expr(stmt->cond);
    free_stmts(stmt->body);
}

void plpgsql_dumptree ( PLpgSQL_function func  ) 

Definition at line 1458 of file pl_funcs.c.

References PLpgSQL_function::action, PLpgSQL_type::atttypmod, PLpgSQL_var::cursor_explicit_argrow, PLpgSQL_var::cursor_explicit_expr, PLpgSQL_var::datatype, PLpgSQL_function::datums, PLpgSQL_var::default_val, PLpgSQL_arrayelem::dtype, PLpgSQL_datum::dtype, dump_block(), dump_expr(), dump_indent, PLpgSQL_row::fieldnames, PLpgSQL_function::fn_signature, i, PLpgSQL_var::isconst, PLpgSQL_stmt_block::lineno, PLpgSQL_function::ndatums, PLpgSQL_row::nfields, PLpgSQL_var::notnull, NULL, PLPGSQL_DTYPE_ARRAYELEM, PLPGSQL_DTYPE_REC, PLPGSQL_DTYPE_RECFIELD, PLPGSQL_DTYPE_ROW, PLPGSQL_DTYPE_VAR, PLpgSQL_row::refname, PLpgSQL_var::refname, PLpgSQL_type::typname, PLpgSQL_type::typoid, and PLpgSQL_row::varnos.

Referenced by do_compile().

{
    int         i;
    PLpgSQL_datum *d;

    printf("\nExecution tree of successfully compiled PL/pgSQL function %s:\n",
           func->fn_signature);

    printf("\nFunction's data area:\n");
    for (i = 0; i < func->ndatums; i++)
    {
        d = func->datums[i];

        printf("    entry %d: ", i);
        switch (d->dtype)
        {
            case PLPGSQL_DTYPE_VAR:
                {
                    PLpgSQL_var *var = (PLpgSQL_var *) d;

                    printf("VAR %-16s type %s (typoid %u) atttypmod %d\n",
                           var->refname, var->datatype->typname,
                           var->datatype->typoid,
                           var->datatype->atttypmod);
                    if (var->isconst)
                        printf("                                  CONSTANT\n");
                    if (var->notnull)
                        printf("                                  NOT NULL\n");
                    if (var->default_val != NULL)
                    {
                        printf("                                  DEFAULT ");
                        dump_expr(var->default_val);
                        printf("\n");
                    }
                    if (var->cursor_explicit_expr != NULL)
                    {
                        if (var->cursor_explicit_argrow >= 0)
                            printf("                                  CURSOR argument row %d\n", var->cursor_explicit_argrow);

                        printf("                                  CURSOR IS ");
                        dump_expr(var->cursor_explicit_expr);
                        printf("\n");
                    }
                }
                break;
            case PLPGSQL_DTYPE_ROW:
                {
                    PLpgSQL_row *row = (PLpgSQL_row *) d;
                    int         i;

                    printf("ROW %-16s fields", row->refname);
                    for (i = 0; i < row->nfields; i++)
                    {
                        if (row->fieldnames[i])
                            printf(" %s=var %d", row->fieldnames[i],
                                   row->varnos[i]);
                    }
                    printf("\n");
                }
                break;
            case PLPGSQL_DTYPE_REC:
                printf("REC %s\n", ((PLpgSQL_rec *) d)->refname);
                break;
            case PLPGSQL_DTYPE_RECFIELD:
                printf("RECFIELD %-16s of REC %d\n",
                       ((PLpgSQL_recfield *) d)->fieldname,
                       ((PLpgSQL_recfield *) d)->recparentno);
                break;
            case PLPGSQL_DTYPE_ARRAYELEM:
                printf("ARRAYELEM of VAR %d subscript ",
                       ((PLpgSQL_arrayelem *) d)->arrayparentno);
                dump_expr(((PLpgSQL_arrayelem *) d)->subscript);
                printf("\n");
                break;
            default:
                printf("??? unknown data type %d\n", d->dtype);
        }
    }
    printf("\nFunction's statements:\n");

    dump_indent = 0;
    printf("%3d:", func->action->lineno);
    dump_block(func->action);
    printf("\nEnd of execution tree of function %s\n\n", func->fn_signature);
    fflush(stdout);
}

void plpgsql_free_function_memory ( PLpgSQL_function func  ) 

Definition at line 648 of file pl_funcs.c.

References PLpgSQL_function::action, Assert, PLpgSQL_var::cursor_explicit_expr, PLpgSQL_function::datums, PLpgSQL_var::default_val, PLpgSQL_arrayelem::dtype, PLpgSQL_datum::dtype, elog, ERROR, PLpgSQL_function::fn_cxt, free_block(), free_expr(), i, MemoryContextDelete(), PLpgSQL_function::ndatums, PLPGSQL_DTYPE_ARRAYELEM, PLPGSQL_DTYPE_REC, PLPGSQL_DTYPE_RECFIELD, PLPGSQL_DTYPE_ROW, PLPGSQL_DTYPE_VAR, and PLpgSQL_function::use_count.

Referenced by delete_function(), and plpgsql_inline_handler().

{
    int         i;

    /* Better not call this on an in-use function */
    Assert(func->use_count == 0);

    /* Release plans associated with variable declarations */
    for (i = 0; i < func->ndatums; i++)
    {
        PLpgSQL_datum *d = func->datums[i];

        switch (d->dtype)
        {
            case PLPGSQL_DTYPE_VAR:
                {
                    PLpgSQL_var *var = (PLpgSQL_var *) d;

                    free_expr(var->default_val);
                    free_expr(var->cursor_explicit_expr);
                }
                break;
            case PLPGSQL_DTYPE_ROW:
                break;
            case PLPGSQL_DTYPE_REC:
                break;
            case PLPGSQL_DTYPE_RECFIELD:
                break;
            case PLPGSQL_DTYPE_ARRAYELEM:
                free_expr(((PLpgSQL_arrayelem *) d)->subscript);
                break;
            default:
                elog(ERROR, "unrecognized data type: %d", d->dtype);
        }
    }
    func->ndatums = 0;

    /* Release plans in statement tree */
    if (func->action)
        free_block(func->action);
    func->action = NULL;

    /*
     * And finally, release all memory except the PLpgSQL_function struct
     * itself (which has to be kept around because there may be multiple
     * fn_extra pointers to it).
     */
    if (func->fn_cxt)
        MemoryContextDelete(func->fn_cxt);
    func->fn_cxt = NULL;
}

const char* plpgsql_getdiag_kindname ( int  kind  ) 

Definition at line 272 of file pl_funcs.c.

References PLPGSQL_GETDIAG_ERROR_CONTEXT, PLPGSQL_GETDIAG_ERROR_DETAIL, PLPGSQL_GETDIAG_ERROR_HINT, PLPGSQL_GETDIAG_MESSAGE_TEXT, PLPGSQL_GETDIAG_RESULT_OID, PLPGSQL_GETDIAG_RETURNED_SQLSTATE, and PLPGSQL_GETDIAG_ROW_COUNT.

Referenced by dump_getdiag().

{
    switch (kind)
    {
        case PLPGSQL_GETDIAG_ROW_COUNT:
            return "ROW_COUNT";
        case PLPGSQL_GETDIAG_RESULT_OID:
            return "RESULT_OID";
        case PLPGSQL_GETDIAG_ERROR_CONTEXT:
            return "PG_EXCEPTION_CONTEXT";
        case PLPGSQL_GETDIAG_ERROR_DETAIL:
            return "PG_EXCEPTION_DETAIL";
        case PLPGSQL_GETDIAG_ERROR_HINT:
            return "PG_EXCEPTION_HINT";
        case PLPGSQL_GETDIAG_RETURNED_SQLSTATE:
            return "RETURNED_SQLSTATE";
        case PLPGSQL_GETDIAG_MESSAGE_TEXT:
            return "MESSAGE_TEXT";
    }

    return "unknown";
}

void plpgsql_ns_additem ( int  itemtype,
int  itemno,
const char *  name 
)

Definition at line 92 of file pl_funcs.c.

References Assert, PLpgSQL_nsitem::itemno, PLpgSQL_nsitem::itemtype, PLpgSQL_nsitem::name, NULL, palloc(), PLPGSQL_NSTYPE_LABEL, and PLpgSQL_nsitem::prev.

Referenced by add_parameter_name(), plpgsql_build_record(), plpgsql_build_variable(), and plpgsql_ns_push().

{
    PLpgSQL_nsitem *nse;

    Assert(name != NULL);
    /* first item added must be a label */
    Assert(ns_top != NULL || itemtype == PLPGSQL_NSTYPE_LABEL);

    nse = palloc(sizeof(PLpgSQL_nsitem) + strlen(name));
    nse->itemtype = itemtype;
    nse->itemno = itemno;
    nse->prev = ns_top;
    strcpy(nse->name, name);
    ns_top = nse;
}

void plpgsql_ns_init ( void   ) 

Definition at line 43 of file pl_funcs.c.

Referenced by do_compile(), and plpgsql_compile_inline().

{
    ns_top = NULL;
}

PLpgSQL_nsitem* plpgsql_ns_lookup ( PLpgSQL_nsitem ns_cur,
bool  localmode,
const char *  name1,
const char *  name2,
const char *  name3,
int *  names_used 
)

Definition at line 130 of file pl_funcs.c.

References PLpgSQL_nsitem::itemtype, PLpgSQL_nsitem::name, NULL, PLPGSQL_NSTYPE_VAR, and PLpgSQL_nsitem::prev.

Referenced by add_parameter_name(), plpgsql_param_ref(), plpgsql_parse_cwordtype(), plpgsql_parse_dblword(), plpgsql_parse_tripword(), plpgsql_parse_word(), plpgsql_parse_wordtype(), and resolve_column_ref().

{
    /* Outer loop iterates once per block level in the namespace chain */
    while (ns_cur != NULL)
    {
        PLpgSQL_nsitem *nsitem;

        /* Check this level for unqualified match to variable name */
        for (nsitem = ns_cur;
             nsitem->itemtype != PLPGSQL_NSTYPE_LABEL;
             nsitem = nsitem->prev)
        {
            if (strcmp(nsitem->name, name1) == 0)
            {
                if (name2 == NULL ||
                    nsitem->itemtype != PLPGSQL_NSTYPE_VAR)
                {
                    if (names_used)
                        *names_used = 1;
                    return nsitem;
                }
            }
        }

        /* Check this level for qualified match to variable name */
        if (name2 != NULL &&
            strcmp(nsitem->name, name1) == 0)
        {
            for (nsitem = ns_cur;
                 nsitem->itemtype != PLPGSQL_NSTYPE_LABEL;
                 nsitem = nsitem->prev)
            {
                if (strcmp(nsitem->name, name2) == 0)
                {
                    if (name3 == NULL ||
                        nsitem->itemtype != PLPGSQL_NSTYPE_VAR)
                    {
                        if (names_used)
                            *names_used = 2;
                        return nsitem;
                    }
                }
            }
        }

        if (localmode)
            break;              /* do not look into upper levels */

        ns_cur = nsitem->prev;
    }

    /* This is just to suppress possibly-uninitialized-variable warnings */
    if (names_used)
        *names_used = 0;
    return NULL;                /* No match found */
}

PLpgSQL_nsitem* plpgsql_ns_lookup_label ( PLpgSQL_nsitem ns_cur,
const char *  name 
)

Definition at line 195 of file pl_funcs.c.

References PLpgSQL_nsitem::itemtype, PLpgSQL_nsitem::name, NULL, PLPGSQL_NSTYPE_LABEL, and PLpgSQL_nsitem::prev.

{
    while (ns_cur != NULL)
    {
        if (ns_cur->itemtype == PLPGSQL_NSTYPE_LABEL &&
            strcmp(ns_cur->name, name) == 0)
            return ns_cur;
        ns_cur = ns_cur->prev;
    }

    return NULL;                /* label not found */
}

void plpgsql_ns_pop ( void   ) 
void plpgsql_ns_push ( const char *  label  ) 

Definition at line 54 of file pl_funcs.c.

References NULL, plpgsql_ns_additem(), and PLPGSQL_NSTYPE_LABEL.

Referenced by do_compile(), and plpgsql_compile_inline().

PLpgSQL_nsitem* plpgsql_ns_top ( void   ) 
const char* plpgsql_stmt_typename ( PLpgSQL_stmt stmt  ) 

Definition at line 213 of file pl_funcs.c.

References _, PLpgSQL_stmt::cmd_type, PLPGSQL_STMT_ASSIGN, PLPGSQL_STMT_BLOCK, PLPGSQL_STMT_CASE, PLPGSQL_STMT_CLOSE, PLPGSQL_STMT_DYNEXECUTE, PLPGSQL_STMT_DYNFORS, PLPGSQL_STMT_EXECSQL, PLPGSQL_STMT_EXIT, PLPGSQL_STMT_FETCH, PLPGSQL_STMT_FORC, PLPGSQL_STMT_FOREACH_A, PLPGSQL_STMT_FORI, PLPGSQL_STMT_FORS, PLPGSQL_STMT_GETDIAG, PLPGSQL_STMT_IF, PLPGSQL_STMT_LOOP, PLPGSQL_STMT_OPEN, PLPGSQL_STMT_PERFORM, PLPGSQL_STMT_RAISE, PLPGSQL_STMT_RETURN, PLPGSQL_STMT_RETURN_NEXT, PLPGSQL_STMT_RETURN_QUERY, and PLPGSQL_STMT_WHILE.

Referenced by plpgsql_exec_error_callback().

{
    switch ((enum PLpgSQL_stmt_types) stmt->cmd_type)
    {
        case PLPGSQL_STMT_BLOCK:
            return _("statement block");
        case PLPGSQL_STMT_ASSIGN:
            return _("assignment");
        case PLPGSQL_STMT_IF:
            return "IF";
        case PLPGSQL_STMT_CASE:
            return "CASE";
        case PLPGSQL_STMT_LOOP:
            return "LOOP";
        case PLPGSQL_STMT_WHILE:
            return "WHILE";
        case PLPGSQL_STMT_FORI:
            return _("FOR with integer loop variable");
        case PLPGSQL_STMT_FORS:
            return _("FOR over SELECT rows");
        case PLPGSQL_STMT_FORC:
            return _("FOR over cursor");
        case PLPGSQL_STMT_FOREACH_A:
            return _("FOREACH over array");
        case PLPGSQL_STMT_EXIT:
            return "EXIT";
        case PLPGSQL_STMT_RETURN:
            return "RETURN";
        case PLPGSQL_STMT_RETURN_NEXT:
            return "RETURN NEXT";
        case PLPGSQL_STMT_RETURN_QUERY:
            return "RETURN QUERY";
        case PLPGSQL_STMT_RAISE:
            return "RAISE";
        case PLPGSQL_STMT_EXECSQL:
            return _("SQL statement");
        case PLPGSQL_STMT_DYNEXECUTE:
            return _("EXECUTE statement");
        case PLPGSQL_STMT_DYNFORS:
            return _("FOR over EXECUTE statement");
        case PLPGSQL_STMT_GETDIAG:
            return "GET DIAGNOSTICS";
        case PLPGSQL_STMT_OPEN:
            return "OPEN";
        case PLPGSQL_STMT_FETCH:
            return "FETCH";
        case PLPGSQL_STMT_CLOSE:
            return "CLOSE";
        case PLPGSQL_STMT_PERFORM:
            return "PERFORM";
    }

    return "unknown";
}


Variable Documentation

int dump_indent [static]
PLpgSQL_nsitem* ns_top = NULL [static]

Definition at line 35 of file pl_funcs.c.