>
> Yeah.  I also noticed in my benchmarking that sprintf() seemed to be
> very slow, to the point where I wondered whether we ought to have our
> own minimal version of sprintf() just for error strings.
>
> Another idea would be to pass a flag indicating whether the context
> that's going to receive the error cares about the additional flags.
> If not, we can skip generating the information.  Not sure how much
> that helps, but maybe...
>

complex solution can take time that we can get by sprintf elimination.

some special flags for block can be solution, that can change a behave
of err* functions. Usually we need only SQLSTATE and this can be
minimized.

maybe pl option

create or replace function foo()
returns .. as $$
#option light_exception
begin
  ...

in this case, only SQLSTATE should be valid. A implementation should
not be hard - but we really need it?

there is oprofile report for bad case:

CREATE OR REPLACE FUNCTION public.fx()
 RETURNS void
 LANGUAGE plpgsql
AS $function$
declare a int = 0; begin
  for i in 1..100000
  loop
    begin
      perform 1/ (a - (i % 1));
    exception when others then
      /* do nothing */
    end;
  end loop;
end;
$function$


5871     10.2975  postgres                 AllocSetAlloc
4472      7.8437  postgres                 MemoryContextAllocZeroAligned
2570      4.5077  postgres                 MemoryContextAlloc
2031      3.5623  postgres                 AllocSetFree
1940      3.4027  postgres                 SearchCatCache
1906      3.3430  postgres                 expand_fmt_string.clone.0
1535      2.6923  postgres                 copyObject
1241      2.1767  postgres                 fmgr_info_cxt_security
1058      1.8557  postgres                 MemoryContextCreate
1057      1.8539  postgres                 ExecInitExpr
1050      1.8417  postgres                 simplify_function
968       1.6978  postgres                 pfree
965       1.6926  postgres                 check_stack_depth
812       1.4242  postgres                 _copyList.clone.20
801       1.4049  postgres                 hash_seq_search
777       1.3628  postgres                 eval_const_expressions_mutator
662       1.1611  postgres                 expression_tree_mutator
591       1.0366  postgres                 expression_tree_walker

and good case

postgres=# create or replace function fx()
returns void as $$
declare a int = 1; begin
  for i in 1..100000
  loop
    begin
      perform 1/ (a - (i % 1));
    exception when others then
      /* do nothing */
    end;
  end loop;
end;
$$ language plpgsql;

7916     10.1067  postgres                 AllocSetAlloc
5956      7.6043  postgres                 MemoryContextAllocZeroAligned
3339      4.2631  postgres                 MemoryContextAlloc
2581      3.2953  postgres                 SearchCatCache
2348      2.9978  postgres                 copyObject
2176      2.7782  postgres                 AllocSetFree
1643      2.0977  postgres                 MemoryContextCreate
1488      1.8998  postgres                 ExecInitExpr
1438      1.8360  postgres                 grouping_planner
1285      1.6406  postgres                 check_stack_depth
1224      1.5627  postgres                 fmgr_info_cxt_security
1094      1.3968  postgres                 pfree
1044      1.3329  postgres                 _copyList.clone.20
1030      1.3151  postgres                 eval_const_expressions_mutator
939       1.1989  postgres                 expression_tree_walker
938       1.1976  postgres                 simplify_function
889       1.1350  postgres                 AllocSetDelete
836       1.0674  postgres                 subquery_planner
834       1.0648  postgres                 expression_tree_mutator

I don't see a errmsg or errdetail there - the most expensive is
expand_fmt_string with 3%

Regards

Pavel

> --
> Robert Haas
> EnterpriseDB: http://www.enterprisedb.com
> The Enterprise PostgreSQL Company

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to