Commit bbd5c207 authored by Peter Eisentraut's avatar Peter Eisentraut

PL/pgSQL: Add statement ID to statement structures

This can be used by a profiler as the index for an array of
per-statement metrics.

Author: Pavel Stehule <pavel.stehule@gmail.com>
Reviewed-by: default avatarPeter Eisentraut <peter.eisentraut@2ndquadrant.com>
Discussion: https://www.postgresql.org/message-id/flat/CAFj8pRDRCjN6rpM9ZccU7Ta_afsNX7mg9=n34F+r445Nt9v2tA@mail.gmail.com/
parent bf2fb2e0
...@@ -368,6 +368,8 @@ do_compile(FunctionCallInfo fcinfo, ...@@ -368,6 +368,8 @@ do_compile(FunctionCallInfo fcinfo,
function->fn_prokind = procStruct->prokind; function->fn_prokind = procStruct->prokind;
function->nstatements = 0;
/* /*
* Initialize the compiler, particularly the namespace stack. The * Initialize the compiler, particularly the namespace stack. The
* outermost namespace contains function parameters and other special * outermost namespace contains function parameters and other special
...@@ -880,6 +882,8 @@ plpgsql_compile_inline(char *proc_source) ...@@ -880,6 +882,8 @@ plpgsql_compile_inline(char *proc_source)
function->extra_warnings = 0; function->extra_warnings = 0;
function->extra_errors = 0; function->extra_errors = 0;
function->nstatements = 0;
plpgsql_ns_init(); plpgsql_ns_init();
plpgsql_ns_push(func_name, PLPGSQL_LABEL_BLOCK); plpgsql_ns_push(func_name, PLPGSQL_LABEL_BLOCK);
plpgsql_DumpExecTree = false; plpgsql_DumpExecTree = false;
...@@ -1020,6 +1024,7 @@ add_dummy_return(PLpgSQL_function *function) ...@@ -1020,6 +1024,7 @@ add_dummy_return(PLpgSQL_function *function)
new = palloc0(sizeof(PLpgSQL_stmt_block)); new = palloc0(sizeof(PLpgSQL_stmt_block));
new->cmd_type = PLPGSQL_STMT_BLOCK; new->cmd_type = PLPGSQL_STMT_BLOCK;
new->stmtid = ++function->nstatements;
new->body = list_make1(function->action); new->body = list_make1(function->action);
function->action = new; function->action = new;
...@@ -1031,6 +1036,7 @@ add_dummy_return(PLpgSQL_function *function) ...@@ -1031,6 +1036,7 @@ add_dummy_return(PLpgSQL_function *function)
new = palloc0(sizeof(PLpgSQL_stmt_return)); new = palloc0(sizeof(PLpgSQL_stmt_return));
new->cmd_type = PLPGSQL_STMT_RETURN; new->cmd_type = PLPGSQL_STMT_RETURN;
new->stmtid = ++function->nstatements;
new->expr = NULL; new->expr = NULL;
new->retvarno = function->out_param_varno; new->retvarno = function->out_param_varno;
......
...@@ -414,6 +414,7 @@ pl_block : decl_sect K_BEGIN proc_sect exception_sect K_END opt_label ...@@ -414,6 +414,7 @@ pl_block : decl_sect K_BEGIN proc_sect exception_sect K_END opt_label
new->cmd_type = PLPGSQL_STMT_BLOCK; new->cmd_type = PLPGSQL_STMT_BLOCK;
new->lineno = plpgsql_location_to_lineno(@2); new->lineno = plpgsql_location_to_lineno(@2);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->label = $1.label; new->label = $1.label;
new->n_initvars = $1.n_initvars; new->n_initvars = $1.n_initvars;
new->initvarnos = $1.initvarnos; new->initvarnos = $1.initvarnos;
...@@ -905,6 +906,7 @@ stmt_perform : K_PERFORM expr_until_semi ...@@ -905,6 +906,7 @@ stmt_perform : K_PERFORM expr_until_semi
new = palloc0(sizeof(PLpgSQL_stmt_perform)); new = palloc0(sizeof(PLpgSQL_stmt_perform));
new->cmd_type = PLPGSQL_STMT_PERFORM; new->cmd_type = PLPGSQL_STMT_PERFORM;
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->expr = $2; new->expr = $2;
$$ = (PLpgSQL_stmt *)new; $$ = (PLpgSQL_stmt *)new;
...@@ -918,6 +920,7 @@ stmt_call : K_CALL ...@@ -918,6 +920,7 @@ stmt_call : K_CALL
new = palloc0(sizeof(PLpgSQL_stmt_call)); new = palloc0(sizeof(PLpgSQL_stmt_call));
new->cmd_type = PLPGSQL_STMT_CALL; new->cmd_type = PLPGSQL_STMT_CALL;
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->expr = read_sql_stmt("CALL "); new->expr = read_sql_stmt("CALL ");
new->is_call = true; new->is_call = true;
...@@ -932,6 +935,7 @@ stmt_call : K_CALL ...@@ -932,6 +935,7 @@ stmt_call : K_CALL
new = palloc0(sizeof(PLpgSQL_stmt_call)); new = palloc0(sizeof(PLpgSQL_stmt_call));
new->cmd_type = PLPGSQL_STMT_CALL; new->cmd_type = PLPGSQL_STMT_CALL;
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->expr = read_sql_stmt("DO "); new->expr = read_sql_stmt("DO ");
new->is_call = false; new->is_call = false;
...@@ -947,6 +951,7 @@ stmt_assign : assign_var assign_operator expr_until_semi ...@@ -947,6 +951,7 @@ stmt_assign : assign_var assign_operator expr_until_semi
new = palloc0(sizeof(PLpgSQL_stmt_assign)); new = palloc0(sizeof(PLpgSQL_stmt_assign));
new->cmd_type = PLPGSQL_STMT_ASSIGN; new->cmd_type = PLPGSQL_STMT_ASSIGN;
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->varno = $1->dno; new->varno = $1->dno;
new->expr = $3; new->expr = $3;
...@@ -962,6 +967,7 @@ stmt_getdiag : K_GET getdiag_area_opt K_DIAGNOSTICS getdiag_list ';' ...@@ -962,6 +967,7 @@ stmt_getdiag : K_GET getdiag_area_opt K_DIAGNOSTICS getdiag_list ';'
new = palloc0(sizeof(PLpgSQL_stmt_getdiag)); new = palloc0(sizeof(PLpgSQL_stmt_getdiag));
new->cmd_type = PLPGSQL_STMT_GETDIAG; new->cmd_type = PLPGSQL_STMT_GETDIAG;
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->is_stacked = $2; new->is_stacked = $2;
new->diag_items = $4; new->diag_items = $4;
...@@ -1149,6 +1155,7 @@ stmt_if : K_IF expr_until_then proc_sect stmt_elsifs stmt_else K_END K_IF ';' ...@@ -1149,6 +1155,7 @@ stmt_if : K_IF expr_until_then proc_sect stmt_elsifs stmt_else K_END K_IF ';'
new = palloc0(sizeof(PLpgSQL_stmt_if)); new = palloc0(sizeof(PLpgSQL_stmt_if));
new->cmd_type = PLPGSQL_STMT_IF; new->cmd_type = PLPGSQL_STMT_IF;
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->cond = $2; new->cond = $2;
new->then_body = $3; new->then_body = $3;
new->elsif_list = $4; new->elsif_list = $4;
...@@ -1253,6 +1260,7 @@ stmt_loop : opt_loop_label K_LOOP loop_body ...@@ -1253,6 +1260,7 @@ stmt_loop : opt_loop_label K_LOOP loop_body
new = palloc0(sizeof(PLpgSQL_stmt_loop)); new = palloc0(sizeof(PLpgSQL_stmt_loop));
new->cmd_type = PLPGSQL_STMT_LOOP; new->cmd_type = PLPGSQL_STMT_LOOP;
new->lineno = plpgsql_location_to_lineno(@2); new->lineno = plpgsql_location_to_lineno(@2);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->label = $1; new->label = $1;
new->body = $3.stmts; new->body = $3.stmts;
...@@ -1270,6 +1278,7 @@ stmt_while : opt_loop_label K_WHILE expr_until_loop loop_body ...@@ -1270,6 +1278,7 @@ stmt_while : opt_loop_label K_WHILE expr_until_loop loop_body
new = palloc0(sizeof(PLpgSQL_stmt_while)); new = palloc0(sizeof(PLpgSQL_stmt_while));
new->cmd_type = PLPGSQL_STMT_WHILE; new->cmd_type = PLPGSQL_STMT_WHILE;
new->lineno = plpgsql_location_to_lineno(@2); new->lineno = plpgsql_location_to_lineno(@2);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->label = $1; new->label = $1;
new->cond = $3; new->cond = $3;
new->body = $4.stmts; new->body = $4.stmts;
...@@ -1290,6 +1299,7 @@ stmt_for : opt_loop_label K_FOR for_control loop_body ...@@ -1290,6 +1299,7 @@ stmt_for : opt_loop_label K_FOR for_control loop_body
new = (PLpgSQL_stmt_fori *) $3; new = (PLpgSQL_stmt_fori *) $3;
new->lineno = plpgsql_location_to_lineno(@2); new->lineno = plpgsql_location_to_lineno(@2);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->label = $1; new->label = $1;
new->body = $4.stmts; new->body = $4.stmts;
$$ = (PLpgSQL_stmt *) new; $$ = (PLpgSQL_stmt *) new;
...@@ -1304,6 +1314,7 @@ stmt_for : opt_loop_label K_FOR for_control loop_body ...@@ -1304,6 +1314,7 @@ stmt_for : opt_loop_label K_FOR for_control loop_body
/* forq is the common supertype of all three */ /* forq is the common supertype of all three */
new = (PLpgSQL_stmt_forq *) $3; new = (PLpgSQL_stmt_forq *) $3;
new->lineno = plpgsql_location_to_lineno(@2); new->lineno = plpgsql_location_to_lineno(@2);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->label = $1; new->label = $1;
new->body = $4.stmts; new->body = $4.stmts;
$$ = (PLpgSQL_stmt *) new; $$ = (PLpgSQL_stmt *) new;
...@@ -1333,6 +1344,7 @@ for_control : for_variable K_IN ...@@ -1333,6 +1344,7 @@ for_control : for_variable K_IN
new = palloc0(sizeof(PLpgSQL_stmt_dynfors)); new = palloc0(sizeof(PLpgSQL_stmt_dynfors));
new->cmd_type = PLPGSQL_STMT_DYNFORS; new->cmd_type = PLPGSQL_STMT_DYNFORS;
new->stmtid = ++plpgsql_curr_compile->nstatements;
if ($1.row) if ($1.row)
{ {
new->var = (PLpgSQL_variable *) $1.row; new->var = (PLpgSQL_variable *) $1.row;
...@@ -1378,6 +1390,7 @@ for_control : for_variable K_IN ...@@ -1378,6 +1390,7 @@ for_control : for_variable K_IN
new = (PLpgSQL_stmt_forc *) palloc0(sizeof(PLpgSQL_stmt_forc)); new = (PLpgSQL_stmt_forc *) palloc0(sizeof(PLpgSQL_stmt_forc));
new->cmd_type = PLPGSQL_STMT_FORC; new->cmd_type = PLPGSQL_STMT_FORC;
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->curvar = cursor->dno; new->curvar = cursor->dno;
/* Should have had a single variable name */ /* Should have had a single variable name */
...@@ -1492,6 +1505,7 @@ for_control : for_variable K_IN ...@@ -1492,6 +1505,7 @@ for_control : for_variable K_IN
new = palloc0(sizeof(PLpgSQL_stmt_fori)); new = palloc0(sizeof(PLpgSQL_stmt_fori));
new->cmd_type = PLPGSQL_STMT_FORI; new->cmd_type = PLPGSQL_STMT_FORI;
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->var = fvar; new->var = fvar;
new->reverse = reverse; new->reverse = reverse;
new->lower = expr1; new->lower = expr1;
...@@ -1526,6 +1540,7 @@ for_control : for_variable K_IN ...@@ -1526,6 +1540,7 @@ for_control : for_variable K_IN
new = palloc0(sizeof(PLpgSQL_stmt_fors)); new = palloc0(sizeof(PLpgSQL_stmt_fors));
new->cmd_type = PLPGSQL_STMT_FORS; new->cmd_type = PLPGSQL_STMT_FORS;
new->stmtid = ++plpgsql_curr_compile->nstatements;
if ($1.row) if ($1.row)
{ {
new->var = (PLpgSQL_variable *) $1.row; new->var = (PLpgSQL_variable *) $1.row;
...@@ -1626,6 +1641,7 @@ stmt_foreach_a : opt_loop_label K_FOREACH for_variable foreach_slice K_IN K_ARRA ...@@ -1626,6 +1641,7 @@ stmt_foreach_a : opt_loop_label K_FOREACH for_variable foreach_slice K_IN K_ARRA
new = palloc0(sizeof(PLpgSQL_stmt_foreach_a)); new = palloc0(sizeof(PLpgSQL_stmt_foreach_a));
new->cmd_type = PLPGSQL_STMT_FOREACH_A; new->cmd_type = PLPGSQL_STMT_FOREACH_A;
new->lineno = plpgsql_location_to_lineno(@2); new->lineno = plpgsql_location_to_lineno(@2);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->label = $1; new->label = $1;
new->slice = $4; new->slice = $4;
new->expr = $7; new->expr = $7;
...@@ -1672,6 +1688,7 @@ stmt_exit : exit_type opt_label opt_exitcond ...@@ -1672,6 +1688,7 @@ stmt_exit : exit_type opt_label opt_exitcond
new = palloc0(sizeof(PLpgSQL_stmt_exit)); new = palloc0(sizeof(PLpgSQL_stmt_exit));
new->cmd_type = PLPGSQL_STMT_EXIT; new->cmd_type = PLPGSQL_STMT_EXIT;
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->is_exit = $1; new->is_exit = $1;
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->label = $2; new->label = $2;
...@@ -1763,6 +1780,7 @@ stmt_raise : K_RAISE ...@@ -1763,6 +1780,7 @@ stmt_raise : K_RAISE
new->cmd_type = PLPGSQL_STMT_RAISE; new->cmd_type = PLPGSQL_STMT_RAISE;
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->elog_level = ERROR; /* default */ new->elog_level = ERROR; /* default */
new->condname = NULL; new->condname = NULL;
new->message = NULL; new->message = NULL;
...@@ -1907,6 +1925,7 @@ stmt_assert : K_ASSERT ...@@ -1907,6 +1925,7 @@ stmt_assert : K_ASSERT
new->cmd_type = PLPGSQL_STMT_ASSERT; new->cmd_type = PLPGSQL_STMT_ASSERT;
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->cond = read_sql_expression2(',', ';', new->cond = read_sql_expression2(',', ';',
", or ;", ", or ;",
...@@ -1984,6 +2003,7 @@ stmt_dynexecute : K_EXECUTE ...@@ -1984,6 +2003,7 @@ stmt_dynexecute : K_EXECUTE
new = palloc(sizeof(PLpgSQL_stmt_dynexecute)); new = palloc(sizeof(PLpgSQL_stmt_dynexecute));
new->cmd_type = PLPGSQL_STMT_DYNEXECUTE; new->cmd_type = PLPGSQL_STMT_DYNEXECUTE;
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->query = expr; new->query = expr;
new->into = false; new->into = false;
new->strict = false; new->strict = false;
...@@ -2040,6 +2060,7 @@ stmt_open : K_OPEN cursor_variable ...@@ -2040,6 +2060,7 @@ stmt_open : K_OPEN cursor_variable
new = palloc0(sizeof(PLpgSQL_stmt_open)); new = palloc0(sizeof(PLpgSQL_stmt_open));
new->cmd_type = PLPGSQL_STMT_OPEN; new->cmd_type = PLPGSQL_STMT_OPEN;
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->curvar = $2->dno; new->curvar = $2->dno;
new->cursor_options = CURSOR_OPT_FAST_PLAN; new->cursor_options = CURSOR_OPT_FAST_PLAN;
...@@ -2164,6 +2185,7 @@ stmt_close : K_CLOSE cursor_variable ';' ...@@ -2164,6 +2185,7 @@ stmt_close : K_CLOSE cursor_variable ';'
new = palloc(sizeof(PLpgSQL_stmt_close)); new = palloc(sizeof(PLpgSQL_stmt_close));
new->cmd_type = PLPGSQL_STMT_CLOSE; new->cmd_type = PLPGSQL_STMT_CLOSE;
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->curvar = $2->dno; new->curvar = $2->dno;
$$ = (PLpgSQL_stmt *)new; $$ = (PLpgSQL_stmt *)new;
...@@ -2184,6 +2206,7 @@ stmt_commit : K_COMMIT ';' ...@@ -2184,6 +2206,7 @@ stmt_commit : K_COMMIT ';'
new = palloc(sizeof(PLpgSQL_stmt_commit)); new = palloc(sizeof(PLpgSQL_stmt_commit));
new->cmd_type = PLPGSQL_STMT_COMMIT; new->cmd_type = PLPGSQL_STMT_COMMIT;
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
$$ = (PLpgSQL_stmt *)new; $$ = (PLpgSQL_stmt *)new;
} }
...@@ -2196,6 +2219,7 @@ stmt_rollback : K_ROLLBACK ';' ...@@ -2196,6 +2219,7 @@ stmt_rollback : K_ROLLBACK ';'
new = palloc(sizeof(PLpgSQL_stmt_rollback)); new = palloc(sizeof(PLpgSQL_stmt_rollback));
new->cmd_type = PLPGSQL_STMT_ROLLBACK; new->cmd_type = PLPGSQL_STMT_ROLLBACK;
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
$$ = (PLpgSQL_stmt *)new; $$ = (PLpgSQL_stmt *)new;
} }
...@@ -2208,6 +2232,8 @@ stmt_set : K_SET ...@@ -2208,6 +2232,8 @@ stmt_set : K_SET
new = palloc0(sizeof(PLpgSQL_stmt_set)); new = palloc0(sizeof(PLpgSQL_stmt_set));
new->cmd_type = PLPGSQL_STMT_SET; new->cmd_type = PLPGSQL_STMT_SET;
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->expr = read_sql_stmt("SET "); new->expr = read_sql_stmt("SET ");
$$ = (PLpgSQL_stmt *)new; $$ = (PLpgSQL_stmt *)new;
...@@ -2219,6 +2245,7 @@ stmt_set : K_SET ...@@ -2219,6 +2245,7 @@ stmt_set : K_SET
new = palloc0(sizeof(PLpgSQL_stmt_set)); new = palloc0(sizeof(PLpgSQL_stmt_set));
new->cmd_type = PLPGSQL_STMT_SET; new->cmd_type = PLPGSQL_STMT_SET;
new->lineno = plpgsql_location_to_lineno(@1); new->lineno = plpgsql_location_to_lineno(@1);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->expr = read_sql_stmt("RESET "); new->expr = read_sql_stmt("RESET ");
$$ = (PLpgSQL_stmt *)new; $$ = (PLpgSQL_stmt *)new;
...@@ -3000,6 +3027,7 @@ make_execsql_stmt(int firsttoken, int location) ...@@ -3000,6 +3027,7 @@ make_execsql_stmt(int firsttoken, int location)
execsql = palloc(sizeof(PLpgSQL_stmt_execsql)); execsql = palloc(sizeof(PLpgSQL_stmt_execsql));
execsql->cmd_type = PLPGSQL_STMT_EXECSQL; execsql->cmd_type = PLPGSQL_STMT_EXECSQL;
execsql->lineno = plpgsql_location_to_lineno(location); execsql->lineno = plpgsql_location_to_lineno(location);
execsql->stmtid = ++plpgsql_curr_compile->nstatements;
execsql->sqlstmt = expr; execsql->sqlstmt = expr;
execsql->into = have_into; execsql->into = have_into;
execsql->strict = have_strict; execsql->strict = have_strict;
...@@ -3025,6 +3053,7 @@ read_fetch_direction(void) ...@@ -3025,6 +3053,7 @@ read_fetch_direction(void)
*/ */
fetch = (PLpgSQL_stmt_fetch *) palloc0(sizeof(PLpgSQL_stmt_fetch)); fetch = (PLpgSQL_stmt_fetch *) palloc0(sizeof(PLpgSQL_stmt_fetch));
fetch->cmd_type = PLPGSQL_STMT_FETCH; fetch->cmd_type = PLPGSQL_STMT_FETCH;
fetch->stmtid = ++plpgsql_curr_compile->nstatements;
/* set direction defaults: */ /* set direction defaults: */
fetch->direction = FETCH_FORWARD; fetch->direction = FETCH_FORWARD;
fetch->how_many = 1; fetch->how_many = 1;
...@@ -3177,6 +3206,7 @@ make_return_stmt(int location) ...@@ -3177,6 +3206,7 @@ make_return_stmt(int location)
new = palloc0(sizeof(PLpgSQL_stmt_return)); new = palloc0(sizeof(PLpgSQL_stmt_return));
new->cmd_type = PLPGSQL_STMT_RETURN; new->cmd_type = PLPGSQL_STMT_RETURN;
new->lineno = plpgsql_location_to_lineno(location); new->lineno = plpgsql_location_to_lineno(location);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->expr = NULL; new->expr = NULL;
new->retvarno = -1; new->retvarno = -1;
...@@ -3264,6 +3294,7 @@ make_return_next_stmt(int location) ...@@ -3264,6 +3294,7 @@ make_return_next_stmt(int location)
new = palloc0(sizeof(PLpgSQL_stmt_return_next)); new = palloc0(sizeof(PLpgSQL_stmt_return_next));
new->cmd_type = PLPGSQL_STMT_RETURN_NEXT; new->cmd_type = PLPGSQL_STMT_RETURN_NEXT;
new->lineno = plpgsql_location_to_lineno(location); new->lineno = plpgsql_location_to_lineno(location);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->expr = NULL; new->expr = NULL;
new->retvarno = -1; new->retvarno = -1;
...@@ -3327,6 +3358,7 @@ make_return_query_stmt(int location) ...@@ -3327,6 +3358,7 @@ make_return_query_stmt(int location)
new = palloc0(sizeof(PLpgSQL_stmt_return_query)); new = palloc0(sizeof(PLpgSQL_stmt_return_query));
new->cmd_type = PLPGSQL_STMT_RETURN_QUERY; new->cmd_type = PLPGSQL_STMT_RETURN_QUERY;
new->lineno = plpgsql_location_to_lineno(location); new->lineno = plpgsql_location_to_lineno(location);
new->stmtid = ++plpgsql_curr_compile->nstatements;
/* check for RETURN QUERY EXECUTE */ /* check for RETURN QUERY EXECUTE */
if ((tok = yylex()) != K_EXECUTE) if ((tok = yylex()) != K_EXECUTE)
...@@ -3997,6 +4029,7 @@ make_case(int location, PLpgSQL_expr *t_expr, ...@@ -3997,6 +4029,7 @@ make_case(int location, PLpgSQL_expr *t_expr,
new = palloc(sizeof(PLpgSQL_stmt_case)); new = palloc(sizeof(PLpgSQL_stmt_case));
new->cmd_type = PLPGSQL_STMT_CASE; new->cmd_type = PLPGSQL_STMT_CASE;
new->lineno = plpgsql_location_to_lineno(location); new->lineno = plpgsql_location_to_lineno(location);
new->stmtid = ++plpgsql_curr_compile->nstatements;
new->t_expr = t_expr; new->t_expr = t_expr;
new->t_varno = 0; new->t_varno = 0;
new->case_when_list = case_when_list; new->case_when_list = case_when_list;
......
...@@ -447,6 +447,13 @@ typedef struct PLpgSQL_stmt ...@@ -447,6 +447,13 @@ typedef struct PLpgSQL_stmt
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
/*
* Unique statement ID in this function (starting at 1; 0 is invalid/not
* set). This can be used by a profiler as the index for an array of
* per-statement metrics.
*/
unsigned int stmtid;
} PLpgSQL_stmt; } PLpgSQL_stmt;
/* /*
...@@ -486,6 +493,7 @@ typedef struct PLpgSQL_stmt_block ...@@ -486,6 +493,7 @@ typedef struct PLpgSQL_stmt_block
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
char *label; char *label;
List *body; /* List of statements */ List *body; /* List of statements */
int n_initvars; /* Length of initvarnos[] */ int n_initvars; /* Length of initvarnos[] */
...@@ -500,6 +508,7 @@ typedef struct PLpgSQL_stmt_assign ...@@ -500,6 +508,7 @@ typedef struct PLpgSQL_stmt_assign
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
int varno; int varno;
PLpgSQL_expr *expr; PLpgSQL_expr *expr;
} PLpgSQL_stmt_assign; } PLpgSQL_stmt_assign;
...@@ -511,6 +520,7 @@ typedef struct PLpgSQL_stmt_perform ...@@ -511,6 +520,7 @@ typedef struct PLpgSQL_stmt_perform
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
PLpgSQL_expr *expr; PLpgSQL_expr *expr;
} PLpgSQL_stmt_perform; } PLpgSQL_stmt_perform;
...@@ -521,6 +531,7 @@ typedef struct PLpgSQL_stmt_call ...@@ -521,6 +531,7 @@ typedef struct PLpgSQL_stmt_call
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
PLpgSQL_expr *expr; PLpgSQL_expr *expr;
bool is_call; bool is_call;
PLpgSQL_variable *target; PLpgSQL_variable *target;
...@@ -533,6 +544,7 @@ typedef struct PLpgSQL_stmt_commit ...@@ -533,6 +544,7 @@ typedef struct PLpgSQL_stmt_commit
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
} PLpgSQL_stmt_commit; } PLpgSQL_stmt_commit;
/* /*
...@@ -542,6 +554,7 @@ typedef struct PLpgSQL_stmt_rollback ...@@ -542,6 +554,7 @@ typedef struct PLpgSQL_stmt_rollback
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
} PLpgSQL_stmt_rollback; } PLpgSQL_stmt_rollback;
/* /*
...@@ -551,6 +564,7 @@ typedef struct PLpgSQL_stmt_set ...@@ -551,6 +564,7 @@ typedef struct PLpgSQL_stmt_set
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
PLpgSQL_expr *expr; PLpgSQL_expr *expr;
} PLpgSQL_stmt_set; } PLpgSQL_stmt_set;
...@@ -570,6 +584,7 @@ typedef struct PLpgSQL_stmt_getdiag ...@@ -570,6 +584,7 @@ typedef struct PLpgSQL_stmt_getdiag
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
bool is_stacked; /* STACKED or CURRENT diagnostics area? */ bool is_stacked; /* STACKED or CURRENT diagnostics area? */
List *diag_items; /* List of PLpgSQL_diag_item */ List *diag_items; /* List of PLpgSQL_diag_item */
} PLpgSQL_stmt_getdiag; } PLpgSQL_stmt_getdiag;
...@@ -581,6 +596,7 @@ typedef struct PLpgSQL_stmt_if ...@@ -581,6 +596,7 @@ typedef struct PLpgSQL_stmt_if
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
PLpgSQL_expr *cond; /* boolean expression for THEN */ PLpgSQL_expr *cond; /* boolean expression for THEN */
List *then_body; /* List of statements */ List *then_body; /* List of statements */
List *elsif_list; /* List of PLpgSQL_if_elsif structs */ List *elsif_list; /* List of PLpgSQL_if_elsif structs */
...@@ -604,6 +620,7 @@ typedef struct PLpgSQL_stmt_case ...@@ -604,6 +620,7 @@ typedef struct PLpgSQL_stmt_case
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
PLpgSQL_expr *t_expr; /* test expression, or NULL if none */ PLpgSQL_expr *t_expr; /* test expression, or NULL if none */
int t_varno; /* var to store test expression value into */ int t_varno; /* var to store test expression value into */
List *case_when_list; /* List of PLpgSQL_case_when structs */ List *case_when_list; /* List of PLpgSQL_case_when structs */
...@@ -628,6 +645,7 @@ typedef struct PLpgSQL_stmt_loop ...@@ -628,6 +645,7 @@ typedef struct PLpgSQL_stmt_loop
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
char *label; char *label;
List *body; /* List of statements */ List *body; /* List of statements */
} PLpgSQL_stmt_loop; } PLpgSQL_stmt_loop;
...@@ -639,6 +657,7 @@ typedef struct PLpgSQL_stmt_while ...@@ -639,6 +657,7 @@ typedef struct PLpgSQL_stmt_while
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
char *label; char *label;
PLpgSQL_expr *cond; PLpgSQL_expr *cond;
List *body; /* List of statements */ List *body; /* List of statements */
...@@ -651,6 +670,7 @@ typedef struct PLpgSQL_stmt_fori ...@@ -651,6 +670,7 @@ typedef struct PLpgSQL_stmt_fori
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
char *label; char *label;
PLpgSQL_var *var; PLpgSQL_var *var;
PLpgSQL_expr *lower; PLpgSQL_expr *lower;
...@@ -669,6 +689,7 @@ typedef struct PLpgSQL_stmt_forq ...@@ -669,6 +689,7 @@ typedef struct PLpgSQL_stmt_forq
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
char *label; char *label;
PLpgSQL_variable *var; /* Loop variable (record or row) */ PLpgSQL_variable *var; /* Loop variable (record or row) */
List *body; /* List of statements */ List *body; /* List of statements */
...@@ -681,6 +702,7 @@ typedef struct PLpgSQL_stmt_fors ...@@ -681,6 +702,7 @@ typedef struct PLpgSQL_stmt_fors
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
char *label; char *label;
PLpgSQL_variable *var; /* Loop variable (record or row) */ PLpgSQL_variable *var; /* Loop variable (record or row) */
List *body; /* List of statements */ List *body; /* List of statements */
...@@ -695,6 +717,7 @@ typedef struct PLpgSQL_stmt_forc ...@@ -695,6 +717,7 @@ typedef struct PLpgSQL_stmt_forc
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
char *label; char *label;
PLpgSQL_variable *var; /* Loop variable (record or row) */ PLpgSQL_variable *var; /* Loop variable (record or row) */
List *body; /* List of statements */ List *body; /* List of statements */
...@@ -710,6 +733,7 @@ typedef struct PLpgSQL_stmt_dynfors ...@@ -710,6 +733,7 @@ typedef struct PLpgSQL_stmt_dynfors
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
char *label; char *label;
PLpgSQL_variable *var; /* Loop variable (record or row) */ PLpgSQL_variable *var; /* Loop variable (record or row) */
List *body; /* List of statements */ List *body; /* List of statements */
...@@ -725,6 +749,7 @@ typedef struct PLpgSQL_stmt_foreach_a ...@@ -725,6 +749,7 @@ typedef struct PLpgSQL_stmt_foreach_a
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
char *label; char *label;
int varno; /* loop target variable */ int varno; /* loop target variable */
int slice; /* slice dimension, or 0 */ int slice; /* slice dimension, or 0 */
...@@ -739,6 +764,7 @@ typedef struct PLpgSQL_stmt_open ...@@ -739,6 +764,7 @@ typedef struct PLpgSQL_stmt_open
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
int curvar; int curvar;
int cursor_options; int cursor_options;
PLpgSQL_expr *argquery; PLpgSQL_expr *argquery;
...@@ -754,6 +780,7 @@ typedef struct PLpgSQL_stmt_fetch ...@@ -754,6 +780,7 @@ typedef struct PLpgSQL_stmt_fetch
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
PLpgSQL_variable *target; /* target (record or row) */ PLpgSQL_variable *target; /* target (record or row) */
int curvar; /* cursor variable to fetch from */ int curvar; /* cursor variable to fetch from */
FetchDirection direction; /* fetch direction */ FetchDirection direction; /* fetch direction */
...@@ -770,6 +797,7 @@ typedef struct PLpgSQL_stmt_close ...@@ -770,6 +797,7 @@ typedef struct PLpgSQL_stmt_close
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
int curvar; int curvar;
} PLpgSQL_stmt_close; } PLpgSQL_stmt_close;
...@@ -780,6 +808,7 @@ typedef struct PLpgSQL_stmt_exit ...@@ -780,6 +808,7 @@ typedef struct PLpgSQL_stmt_exit
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
bool is_exit; /* Is this an exit or a continue? */ bool is_exit; /* Is this an exit or a continue? */
char *label; /* NULL if it's an unlabelled EXIT/CONTINUE */ char *label; /* NULL if it's an unlabelled EXIT/CONTINUE */
PLpgSQL_expr *cond; PLpgSQL_expr *cond;
...@@ -792,6 +821,7 @@ typedef struct PLpgSQL_stmt_return ...@@ -792,6 +821,7 @@ typedef struct PLpgSQL_stmt_return
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
PLpgSQL_expr *expr; PLpgSQL_expr *expr;
int retvarno; int retvarno;
} PLpgSQL_stmt_return; } PLpgSQL_stmt_return;
...@@ -803,6 +833,7 @@ typedef struct PLpgSQL_stmt_return_next ...@@ -803,6 +833,7 @@ typedef struct PLpgSQL_stmt_return_next
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
PLpgSQL_expr *expr; PLpgSQL_expr *expr;
int retvarno; int retvarno;
} PLpgSQL_stmt_return_next; } PLpgSQL_stmt_return_next;
...@@ -814,6 +845,7 @@ typedef struct PLpgSQL_stmt_return_query ...@@ -814,6 +845,7 @@ typedef struct PLpgSQL_stmt_return_query
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
PLpgSQL_expr *query; /* if static query */ PLpgSQL_expr *query; /* if static query */
PLpgSQL_expr *dynquery; /* if dynamic query (RETURN QUERY EXECUTE) */ PLpgSQL_expr *dynquery; /* if dynamic query (RETURN QUERY EXECUTE) */
List *params; /* USING arguments for dynamic query */ List *params; /* USING arguments for dynamic query */
...@@ -826,6 +858,7 @@ typedef struct PLpgSQL_stmt_raise ...@@ -826,6 +858,7 @@ typedef struct PLpgSQL_stmt_raise
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
int elog_level; int elog_level;
char *condname; /* condition name, SQLSTATE, or NULL */ char *condname; /* condition name, SQLSTATE, or NULL */
char *message; /* old-style message format literal, or NULL */ char *message; /* old-style message format literal, or NULL */
...@@ -849,6 +882,7 @@ typedef struct PLpgSQL_stmt_assert ...@@ -849,6 +882,7 @@ typedef struct PLpgSQL_stmt_assert
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
PLpgSQL_expr *cond; PLpgSQL_expr *cond;
PLpgSQL_expr *message; PLpgSQL_expr *message;
} PLpgSQL_stmt_assert; } PLpgSQL_stmt_assert;
...@@ -860,6 +894,7 @@ typedef struct PLpgSQL_stmt_execsql ...@@ -860,6 +894,7 @@ typedef struct PLpgSQL_stmt_execsql
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
PLpgSQL_expr *sqlstmt; PLpgSQL_expr *sqlstmt;
bool mod_stmt; /* is the stmt INSERT/UPDATE/DELETE? Note: bool mod_stmt; /* is the stmt INSERT/UPDATE/DELETE? Note:
* mod_stmt is set when we plan the query */ * mod_stmt is set when we plan the query */
...@@ -875,6 +910,7 @@ typedef struct PLpgSQL_stmt_dynexecute ...@@ -875,6 +910,7 @@ typedef struct PLpgSQL_stmt_dynexecute
{ {
PLpgSQL_stmt_type cmd_type; PLpgSQL_stmt_type cmd_type;
int lineno; int lineno;
unsigned int stmtid;
PLpgSQL_expr *query; /* string expression */ PLpgSQL_expr *query; /* string expression */
bool into; /* INTO supplied? */ bool into; /* INTO supplied? */
bool strict; /* INTO STRICT flag */ bool strict; /* INTO STRICT flag */
...@@ -963,6 +999,9 @@ typedef struct PLpgSQL_function ...@@ -963,6 +999,9 @@ typedef struct PLpgSQL_function
int extra_warnings; int extra_warnings;
int extra_errors; int extra_errors;
/* count of statements inside function */
unsigned int nstatements;
/* the datums representing the function's local variables */ /* the datums representing the function's local variables */
int ndatums; int ndatums;
PLpgSQL_datum **datums; PLpgSQL_datum **datums;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment