2015-07-09 20:08 GMT+02:00 Merlin Moncure <mmonc...@gmail.com>:

> On Thu, Jul 9, 2015 at 10:48 AM, Pavel Stehule <pavel.steh...@gmail.com>
> wrote:
> >
> > 2015-07-09 15:17 GMT+02:00 Merlin Moncure <mmonc...@gmail.com>:
> >>
> >> On Wed, Jul 8, 2015 at 11:28 PM, Pavel Stehule <pavel.steh...@gmail.com
> >
> >> wrote:
> >> > Hi
> >> >
> >> > second version of this patch
> >> >
> >> > make check-world passed
> >>
> >> quickly scanning the patch, the implementation is trivial (minus
> >> regression test adjustments), and is, IMSNSHO, the right solution.
> >
> >
> > yes, it is right way - the behave of RAISE statement will be much more
> > cleaner
> >>
> >>
> >> Several of the source level comments need some minor wordsmithing and
> >> the GUCs are missing documentation.  If we've got consensus on the
> >> approach, I'll pitch in on that.
> >
> > thank you
>
> revised patch attached. added GUC docs and cleaned up pg_settings
> language.  Also tested patch and it works beautifully.
>
> Note, Pavel's patch does adjust default behavior to what we think is
> the "right" settings.
>

Thank you for documentation.

There is small error - default for client_min_context is error - not
notice. With this level a diff from regress tests is minimal. Default for
log_min_context should be warning.

 Regards

Pavel


>
> merlin
>
diff --git a/contrib/dblink/expected/dblink.out b/contrib/dblink/expected/dblink.out
new file mode 100644
index a49b562..a268fc7
*** a/contrib/dblink/expected/dblink.out
--- b/contrib/dblink/expected/dblink.out
***************
*** 1,3 ****
--- 1,4 ----
+ set client_min_context TO notice;
  CREATE EXTENSION dblink;
  CREATE TABLE foo(f1 int, f2 text, f3 text[], primary key (f1,f2));
  INSERT INTO foo VALUES (0,'a','{"a0","b0","c0"}');
diff --git a/contrib/dblink/sql/dblink.sql b/contrib/dblink/sql/dblink.sql
new file mode 100644
index ea78cc2..cf7e57e
*** a/contrib/dblink/sql/dblink.sql
--- b/contrib/dblink/sql/dblink.sql
***************
*** 1,3 ****
--- 1,5 ----
+ set client_min_context TO notice;
+ 
  CREATE EXTENSION dblink;
  
  CREATE TABLE foo(f1 int, f2 text, f3 text[], primary key (f1,f2));
diff --git a/contrib/hstore_plperl/expected/hstore_plperlu.out b/contrib/hstore_plperl/expected/hstore_plperlu.out
new file mode 100644
index 8c689ad..c97fd3f
*** a/contrib/hstore_plperl/expected/hstore_plperlu.out
--- b/contrib/hstore_plperl/expected/hstore_plperlu.out
*************** INFO:  $VAR1 = {
*** 29,35 ****
            'cc' => undef
          };
  
- CONTEXT:  PL/Perl function "test1"
   test1 
  -------
       2
--- 29,34 ----
*************** $$;
*** 46,52 ****
  SELECT test1none('aa=>bb, cc=>NULL'::hstore);
  INFO:  $VAR1 = '"aa"=>"bb", "cc"=>NULL';
  
- CONTEXT:  PL/Perl function "test1none"
   test1none 
  -----------
           0
--- 45,50 ----
*************** INFO:  $VAR1 = {
*** 67,73 ****
            'cc' => undef
          };
  
- CONTEXT:  PL/Perl function "test1list"
   test1list 
  -----------
           2
--- 65,70 ----
*************** $VAR2 = {
*** 92,98 ****
            'dd' => 'ee'
          };
  
- CONTEXT:  PL/Perl function "test1arr"
   test1arr 
  ----------
          2
--- 89,94 ----
*************** INFO:  $VAR1 = {
*** 120,129 ****
            'cc' => undef
          };
  
- CONTEXT:  PL/Perl function "test3"
  INFO:  $VAR1 = '"a"=>"1", "b"=>"boo", "c"=>NULL';
  
- CONTEXT:  PL/Perl function "test3"
   test3 
  -------
   
--- 116,123 ----
*************** INFO:  $VAR1 = {
*** 161,167 ****
                 }
          };
  
- CONTEXT:  PL/Perl function "test4"
  SELECT * FROM test1;
   a |                b                
  ---+---------------------------------
--- 155,160 ----
diff --git a/contrib/hstore_plpython/expected/hstore_plpython.out b/contrib/hstore_plpython/expected/hstore_plpython.out
new file mode 100644
index b7a6a92..23091d3
*** a/contrib/hstore_plpython/expected/hstore_plpython.out
--- b/contrib/hstore_plpython/expected/hstore_plpython.out
*************** return len(val)
*** 13,19 ****
  $$;
  SELECT test1('aa=>bb, cc=>NULL'::hstore);
  INFO:  [('aa', 'bb'), ('cc', None)]
- CONTEXT:  PL/Python function "test1"
   test1 
  -------
       2
--- 13,18 ----
*************** return len(val)
*** 32,38 ****
  $$;
  SELECT test1n('aa=>bb, cc=>NULL'::hstore);
  INFO:  [('aa', 'bb'), ('cc', None)]
- CONTEXT:  PL/Python function "test1n"
   test1n 
  --------
        2
--- 31,36 ----
diff --git a/contrib/ltree_plpython/expected/ltree_plpython.out b/contrib/ltree_plpython/expected/ltree_plpython.out
new file mode 100644
index 934529e..c6e8a7c
*** a/contrib/ltree_plpython/expected/ltree_plpython.out
--- b/contrib/ltree_plpython/expected/ltree_plpython.out
*************** return len(val)
*** 9,15 ****
  $$;
  SELECT test1('aa.bb.cc'::ltree);
  INFO:  ['aa', 'bb', 'cc']
- CONTEXT:  PL/Python function "test1"
   test1 
  -------
       3
--- 9,14 ----
*************** return len(val)
*** 24,30 ****
  $$;
  SELECT test1n('aa.bb.cc'::ltree);
  INFO:  ['aa', 'bb', 'cc']
- CONTEXT:  PL/Python function "test1n"
   test1n 
  --------
        3
--- 23,28 ----
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
new file mode 100644
index b91d6c7..6365d4a
*** a/doc/src/sgml/config.sgml
--- b/doc/src/sgml/config.sgml
*************** local0.*    /var/log/postgresql
*** 4144,4149 ****
--- 4144,4171 ----
  
       <variablelist>
  
+      <varlistentry id="guc-client-min-context" xreflabel="client_min_context">
+       <term><varname>client_min_context</varname> (<type>enum</type>)
+       <indexterm>
+        <primary><varname>client_min_context</> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Controls which message levels include context when sent to the client.
+         Valid values are <literal>DEBUG5</>,
+         <literal>DEBUG4</>, <literal>DEBUG3</>, <literal>DEBUG2</>,
+         <literal>DEBUG1</>, <literal>LOG</>, <literal>NOTICE</>,
+         <literal>WARNING</>, <literal>ERROR</>, <literal>FATAL</>,
+         and <literal>PANIC</>.  Each level
+         includes all the levels that follow it.  The later the level,
+         the fewer messages are sent.  The default is
+         <literal>ERROR</>.  Note that <literal>LOG</> has a different
+         rank here than in <varname>log_min_messages</>.
+        </para>
+       </listitem>
+      </varlistentry>
+ 
       <varlistentry id="guc-client-min-messages" xreflabel="client_min_messages">
        <term><varname>client_min_messages</varname> (<type>enum</type>)
        <indexterm>
*************** local0.*    /var/log/postgresql
*** 4165,4170 ****
--- 4187,4216 ----
         </para>
        </listitem>
       </varlistentry>
+ 
+      <varlistentry id="guc-log-min-context" xreflabel="log_min_context">
+       <term><varname>log_min_context</varname> (<type>enum</type>)
+       <indexterm>
+        <primary><varname>log_min_context</> configuration parameter</primary>
+       </indexterm>
+       </term>
+       <listitem>
+        <para>
+         Controls which message levels include context when written to 
+         the server log.
+         Valid values are <literal>DEBUG5</>, <literal>DEBUG4</>,
+         <literal>DEBUG3</>, <literal>DEBUG2</>, <literal>DEBUG1</>,
+         <literal>INFO</>, <literal>NOTICE</>, <literal>WARNING</>,
+         <literal>ERROR</>, <literal>LOG</>, <literal>FATAL</>, and
+         <literal>PANIC</>.  Each level includes all the levels that
+         follow it.  The later the level, the fewer messages are sent
+         to the log.  The default is <literal>WARNING</>.  Note that
+         <literal>LOG</> has a different rank here than in
+         <varname>client_min_messages</>.
+         Only superusers can change this setting.
+        </para>
+       </listitem>
+      </varlistentry>
  
       <varlistentry id="guc-log-min-messages" xreflabel="log_min_messages">
        <term><varname>log_min_messages</varname> (<type>enum</type>)
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
new file mode 100644
index 088c714..9445230
*** a/src/backend/utils/error/elog.c
--- b/src/backend/utils/error/elog.c
*************** write_csvlog(ErrorData *edata)
*** 2730,2736 ****
  	appendStringInfoChar(&buf, ',');
  
  	/* errcontext */
! 	if (!edata->hide_ctx)
  		appendCSVLiteral(&buf, edata->context);
  	appendStringInfoChar(&buf, ',');
  
--- 2730,2736 ----
  	appendStringInfoChar(&buf, ',');
  
  	/* errcontext */
! 	if (!edata->hide_ctx && edata->elevel >= log_min_context)
  		appendCSVLiteral(&buf, edata->context);
  	appendStringInfoChar(&buf, ',');
  
*************** send_message_to_server_log(ErrorData *ed
*** 2863,2869 ****
  			append_with_tabs(&buf, edata->internalquery);
  			appendStringInfoChar(&buf, '\n');
  		}
! 		if (edata->context && !edata->hide_ctx)
  		{
  			log_line_prefix(&buf, edata);
  			appendStringInfoString(&buf, _("CONTEXT:  "));
--- 2863,2869 ----
  			append_with_tabs(&buf, edata->internalquery);
  			appendStringInfoChar(&buf, '\n');
  		}
! 		if (edata->context && !edata->hide_ctx && edata->elevel >= log_min_context)
  		{
  			log_line_prefix(&buf, edata);
  			appendStringInfoString(&buf, _("CONTEXT:  "));
*************** send_message_to_frontend(ErrorData *edat
*** 3137,3143 ****
  			err_sendstring(&msgbuf, edata->hint);
  		}
  
! 		if (edata->context)
  		{
  			pq_sendbyte(&msgbuf, PG_DIAG_CONTEXT);
  			err_sendstring(&msgbuf, edata->context);
--- 3137,3143 ----
  			err_sendstring(&msgbuf, edata->hint);
  		}
  
! 		if (edata->context && edata->elevel >= client_min_context)
  		{
  			pq_sendbyte(&msgbuf, PG_DIAG_CONTEXT);
  			err_sendstring(&msgbuf, edata->context);
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
new file mode 100644
index 1bed525..cae8094
*** a/src/backend/utils/misc/guc.c
--- b/src/backend/utils/misc/guc.c
*************** bool		Password_encryption = true;
*** 430,435 ****
--- 430,437 ----
  int			log_min_error_statement = ERROR;
  int			log_min_messages = WARNING;
  int			client_min_messages = NOTICE;
+ int			log_min_context = WARNING;
+ int			client_min_context = ERROR;
  int			log_min_duration_statement = -1;
  int			log_temp_files = -1;
  int			trace_recovery_messages = LOG;
*************** static struct config_enum ConfigureNames
*** 3426,3431 ****
--- 3428,3444 ----
  	},
  
  	{
+ 		{"client_min_context", PGC_USERSET, LOGGING_WHEN,
+ 			gettext_noop("Sets the message levels for which context is sent to the client."),
+ 			gettext_noop("Each level includes all the levels that follow it. The later"
+ 						 " the level, the less context is sent.")
+ 		},
+ 		&client_min_context,
+ 		ERROR, client_message_level_options,
+ 		NULL, NULL, NULL
+ 	},
+ 
+ 	{
  		{"client_min_messages", PGC_USERSET, LOGGING_WHEN,
  			gettext_noop("Sets the message levels that are sent to the client."),
  			gettext_noop("Each level includes all the levels that follow it. The later"
*************** static struct config_enum ConfigureNames
*** 3478,3483 ****
--- 3491,3507 ----
  		NULL, NULL, NULL
  	},
  
+ 	{
+ 		{"log_min_context", PGC_SUSET, LOGGING_WHEN,
+ 			gettext_noop("Sets the message levels for which context is logged."),
+ 			gettext_noop("Each level includes all the levels that follow it. The later"
+ 						 " the level, the less context is sent.")
+ 		},
+ 		&log_min_context,
+ 		WARNING, server_message_level_options,
+ 		NULL, NULL, NULL
+ 	},
+ 
  	{
  		{"log_min_messages", PGC_SUSET, LOGGING_WHEN,
  			gettext_noop("Sets the message levels that are logged."),
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
new file mode 100644
index 06dfc06..8695e8b
*** a/src/backend/utils/misc/postgresql.conf.sample
--- b/src/backend/utils/misc/postgresql.conf.sample
***************
*** 360,365 ****
--- 360,390 ----
  
  # - When to Log -
  
+ #client_min_context = error		# values in order of decreasing detail:
+ 					#   debug5
+ 					#   debug4
+ 					#   debug3
+ 					#   debug2
+ 					#   debug1
+ 					#   log
+ 					#   notice
+ 					#   warning
+ 					#   error
+ 
+ #log_min_context = warning		# values in order of decreasing detail:
+ 					#   debug5
+ 					#   debug4
+ 					#   debug3
+ 					#   debug2
+ 					#   debug1
+ 					#   info
+ 					#   notice
+ 					#   warning
+ 					#   error
+ 					#   log
+ 					#   fatal
+ 					#   panic
+ 
  #client_min_messages = notice		# values in order of decreasing detail:
  					#   debug5
  					#   debug4
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
new file mode 100644
index dc167f9..f03a5e1
*** a/src/include/utils/guc.h
--- b/src/include/utils/guc.h
*************** extern PGDLLIMPORT bool check_function_b
*** 246,251 ****
--- 246,253 ----
  extern bool default_with_oids;
  extern bool SQL_inheritance;
  
+ extern int	log_min_context;
+ extern int	client_min_context;
  extern int	log_min_error_statement;
  extern int	log_min_messages;
  extern int	client_min_messages;
diff --git a/src/pl/plperl/expected/plperl.out b/src/pl/plperl/expected/plperl.out
new file mode 100644
index d23a302..14df5f4
*** a/src/pl/plperl/expected/plperl.out
--- b/src/pl/plperl/expected/plperl.out
*************** DO $$
*** 614,620 ****
    elog(NOTICE, $a);
  $$ LANGUAGE plperl;
  NOTICE:  This is a test
- CONTEXT:  PL/Perl anonymous code block
  -- check that restricted operations are rejected in a plperl DO block
  DO $$ system("/nonesuch"); $$ LANGUAGE plperl;
  ERROR:  'system' trapped by operation mask at line 1.
--- 614,619 ----
*************** CONTEXT:  PL/Perl anonymous code block
*** 628,634 ****
  -- check that eval is allowed and eval'd restricted ops are caught
  DO $$ eval q{chdir '.';}; warn "Caught: $@"; $$ LANGUAGE plperl;
  WARNING:  Caught: 'chdir' trapped by operation mask at line 1.
- CONTEXT:  PL/Perl anonymous code block
  -- check that compiling do (dofile opcode) is allowed
  -- but that executing it for a file not already loaded (via require) dies
  DO $$ warn do "/dev/null"; $$ LANGUAGE plperl;
--- 627,632 ----
diff --git a/src/pl/plperl/expected/plperl_elog.out b/src/pl/plperl/expected/plperl_elog.out
new file mode 100644
index c447fa2..3f9449a
*** a/src/pl/plperl/expected/plperl_elog.out
--- b/src/pl/plperl/expected/plperl_elog.out
*************** create or replace function perl_elog(tex
*** 7,13 ****
  $$;
  select perl_elog('explicit elog');
  NOTICE:  explicit elog
- CONTEXT:  PL/Perl function "perl_elog"
   perl_elog 
  -----------
   
--- 7,12 ----
*************** create or replace function perl_warn(tex
*** 21,27 ****
  $$;
  select perl_warn('implicit elog via warn');
  WARNING:  implicit elog via warn at line 4.
- CONTEXT:  PL/Perl function "perl_warn"
   perl_warn 
  -----------
   
--- 20,25 ----
*************** select uses_global();
*** 61,67 ****
  -- make sure we don't choke on readonly values
  do language plperl $$ elog(NOTICE, ${^TAINT}); $$;
  NOTICE:  0
- CONTEXT:  PL/Perl anonymous code block
  -- test recovery after "die"
  create or replace function just_die() returns void language plperl AS $$
  die "just die";
--- 59,64 ----
*************** return $a + $b;
*** 94,104 ****
  $$;
  select indirect_die_caller();
  NOTICE:  caught die
- CONTEXT:  SQL statement "SELECT die_caller() AS fx"
- PL/Perl function "indirect_die_caller"
  NOTICE:  caught die
- CONTEXT:  SQL statement "SELECT die_caller() AS fx"
- PL/Perl function "indirect_die_caller"
   indirect_die_caller 
  ---------------------
                     2
--- 91,97 ----
diff --git a/src/pl/plperl/expected/plperl_trigger.out b/src/pl/plperl/expected/plperl_trigger.out
new file mode 100644
index 36ecb92..5e3860e
*** a/src/pl/plperl/expected/plperl_trigger.out
--- b/src/pl/plperl/expected/plperl_trigger.out
*************** BEFORE INSERT OR UPDATE OR DELETE ON tri
*** 62,136 ****
  FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo');
  insert into trigger_test values(1,'insert', '("(1)")');
  NOTICE:  $_TD->{argc} = '2'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{args} = ['23', 'skidoo']
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{event} = 'INSERT'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{level} = 'ROW'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{name} = 'show_trigger_data_trig'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{new} = {'foo' => {'rfoo' => {'i' => '1'}}, 'i' => '1', 'v' => 'insert'}
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{relid} = 'bogus:12345'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{relname} = 'trigger_test'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{table_name} = 'trigger_test'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{table_schema} = 'public'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{when} = 'BEFORE'
- CONTEXT:  PL/Perl function "trigger_data"
  update trigger_test set v = 'update' where i = 1;
  NOTICE:  $_TD->{argc} = '2'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{args} = ['23', 'skidoo']
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{event} = 'UPDATE'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{level} = 'ROW'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{name} = 'show_trigger_data_trig'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{new} = {'foo' => {'rfoo' => {'i' => '1'}}, 'i' => '1', 'v' => 'update'}
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{old} = {'foo' => {'rfoo' => {'i' => '1'}}, 'i' => '1', 'v' => 'insert'}
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{relid} = 'bogus:12345'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{relname} = 'trigger_test'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{table_name} = 'trigger_test'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{table_schema} = 'public'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{when} = 'BEFORE'
- CONTEXT:  PL/Perl function "trigger_data"
  delete from trigger_test;
  NOTICE:  $_TD->{argc} = '2'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{args} = ['23', 'skidoo']
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{event} = 'DELETE'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{level} = 'ROW'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{name} = 'show_trigger_data_trig'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{old} = {'foo' => {'rfoo' => {'i' => '1'}}, 'i' => '1', 'v' => 'update'}
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{relid} = 'bogus:12345'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{relname} = 'trigger_test'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{table_name} = 'trigger_test'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{table_schema} = 'public'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{when} = 'BEFORE'
- CONTEXT:  PL/Perl function "trigger_data"
  DROP TRIGGER show_trigger_data_trig on trigger_test;
  insert into trigger_test values(1,'insert', '("(1)")');
  CREATE VIEW trigger_test_view AS SELECT * FROM trigger_test;
--- 62,102 ----
*************** INSTEAD OF INSERT OR UPDATE OR DELETE ON
*** 139,213 ****
  FOR EACH ROW EXECUTE PROCEDURE trigger_data(24,'skidoo view');
  insert into trigger_test_view values(2,'insert', '("(2)")');
  NOTICE:  $_TD->{argc} = '2'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{args} = ['24', 'skidoo view']
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{event} = 'INSERT'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{level} = 'ROW'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{name} = 'show_trigger_data_trig'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{new} = {'foo' => {'rfoo' => {'i' => '2'}}, 'i' => '2', 'v' => 'insert'}
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{relid} = 'bogus:12345'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{relname} = 'trigger_test_view'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{table_name} = 'trigger_test_view'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{table_schema} = 'public'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{when} = 'INSTEAD OF'
- CONTEXT:  PL/Perl function "trigger_data"
  update trigger_test_view set v = 'update', foo = '("(3)")' where i = 1;
  NOTICE:  $_TD->{argc} = '2'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{args} = ['24', 'skidoo view']
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{event} = 'UPDATE'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{level} = 'ROW'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{name} = 'show_trigger_data_trig'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{new} = {'foo' => {'rfoo' => {'i' => '3'}}, 'i' => '1', 'v' => 'update'}
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{old} = {'foo' => {'rfoo' => {'i' => '1'}}, 'i' => '1', 'v' => 'insert'}
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{relid} = 'bogus:12345'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{relname} = 'trigger_test_view'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{table_name} = 'trigger_test_view'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{table_schema} = 'public'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{when} = 'INSTEAD OF'
- CONTEXT:  PL/Perl function "trigger_data"
  delete from trigger_test_view;
  NOTICE:  $_TD->{argc} = '2'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{args} = ['24', 'skidoo view']
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{event} = 'DELETE'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{level} = 'ROW'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{name} = 'show_trigger_data_trig'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{old} = {'foo' => {'rfoo' => {'i' => '1'}}, 'i' => '1', 'v' => 'insert'}
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{relid} = 'bogus:12345'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{relname} = 'trigger_test_view'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{table_name} = 'trigger_test_view'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{table_schema} = 'public'
- CONTEXT:  PL/Perl function "trigger_data"
  NOTICE:  $_TD->{when} = 'INSTEAD OF'
- CONTEXT:  PL/Perl function "trigger_data"
  DROP VIEW trigger_test_view;
  delete from trigger_test;
  DROP FUNCTION trigger_data();
--- 105,145 ----
*************** create event trigger perl_b_snitch on dd
*** 319,346 ****
     execute procedure perlsnitch();
  create or replace function foobar() returns int language sql as $$select 1;$$;
  NOTICE:  perlsnitch: ddl_command_start CREATE FUNCTION 
- CONTEXT:  PL/Perl function "perlsnitch"
  NOTICE:  perlsnitch: ddl_command_end CREATE FUNCTION 
- CONTEXT:  PL/Perl function "perlsnitch"
  alter function foobar() cost 77;
  NOTICE:  perlsnitch: ddl_command_start ALTER FUNCTION 
- CONTEXT:  PL/Perl function "perlsnitch"
  NOTICE:  perlsnitch: ddl_command_end ALTER FUNCTION 
- CONTEXT:  PL/Perl function "perlsnitch"
  drop function foobar();
  NOTICE:  perlsnitch: ddl_command_start DROP FUNCTION 
- CONTEXT:  PL/Perl function "perlsnitch"
  NOTICE:  perlsnitch: ddl_command_end DROP FUNCTION 
- CONTEXT:  PL/Perl function "perlsnitch"
  create table foo();
  NOTICE:  perlsnitch: ddl_command_start CREATE TABLE 
- CONTEXT:  PL/Perl function "perlsnitch"
  NOTICE:  perlsnitch: ddl_command_end CREATE TABLE 
- CONTEXT:  PL/Perl function "perlsnitch"
  drop table foo;
  NOTICE:  perlsnitch: ddl_command_start DROP TABLE 
- CONTEXT:  PL/Perl function "perlsnitch"
  NOTICE:  perlsnitch: ddl_command_end DROP TABLE 
- CONTEXT:  PL/Perl function "perlsnitch"
  drop event trigger perl_a_snitch;
  drop event trigger perl_b_snitch;
--- 251,268 ----
diff --git a/src/pl/plperl/expected/plperlu.out b/src/pl/plperl/expected/plperlu.out
new file mode 100644
index 3daf4ce..a3edb38
*** a/src/pl/plperl/expected/plperlu.out
--- b/src/pl/plperl/expected/plperlu.out
*************** LOAD 'plperl';
*** 6,12 ****
  SET plperl.on_plperlu_init = '$_SHARED{init} = 42';
  DO $$ warn $_SHARED{init} $$ language plperlu;
  WARNING:  42 at line 1.
- CONTEXT:  PL/Perl anonymous code block
  --
  -- Test compilation of unicode regex - regardless of locale.
  -- This code fails in plain plperl in a non-UTF8 database.
--- 6,11 ----
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
new file mode 100644
index 7d4001c..e1a6b7d
*** a/src/pl/plpgsql/src/pl_exec.c
--- b/src/pl/plpgsql/src/pl_exec.c
***************
*** 42,49 ****
  #include "utils/typcache.h"
  
  
- static const char *const raise_skip_msg = "RAISE";
- 
  typedef struct
  {
  	int			nargs;			/* number of arguments */
--- 42,47 ----
*************** plpgsql_exec_error_callback(void *arg)
*** 939,948 ****
  {
  	PLpgSQL_execstate *estate = (PLpgSQL_execstate *) arg;
  
- 	/* if we are doing RAISE, don't report its location */
- 	if (estate->err_text == raise_skip_msg)
- 		return;
- 
  	if (estate->err_text != NULL)
  	{
  		/*
--- 937,942 ----
*************** exec_stmt_raise(PLpgSQL_execstate *estat
*** 3158,3165 ****
  	/*
  	 * Throw the error (may or may not come back)
  	 */
- 	estate->err_text = raise_skip_msg;	/* suppress traceback of raise */
- 
  	ereport(stmt->elog_level,
  			(err_code ? errcode(err_code) : 0,
  			 errmsg_internal("%s", err_message),
--- 3152,3157 ----
diff --git a/src/pl/plpython/expected/plpython_do.out b/src/pl/plpython/expected/plpython_do.out
new file mode 100644
index 0977812..e300530
*** a/src/pl/plpython/expected/plpython_do.out
--- b/src/pl/plpython/expected/plpython_do.out
***************
*** 1,9 ****
  DO $$ plpy.notice("This is plpythonu.") $$ LANGUAGE plpythonu;
  NOTICE:  This is plpythonu.
- CONTEXT:  PL/Python anonymous code block
  DO $$ plpy.notice("This is plpython2u.") $$ LANGUAGE plpython2u;
  NOTICE:  This is plpython2u.
- CONTEXT:  PL/Python anonymous code block
  DO $$ raise Exception("error test") $$ LANGUAGE plpythonu;
  ERROR:  Exception: error test
  CONTEXT:  Traceback (most recent call last):
--- 1,7 ----
diff --git a/src/pl/plpython/expected/plpython_error.out b/src/pl/plpython/expected/plpython_error.out
new file mode 100644
index be2ec97..1f52af7
*** a/src/pl/plpython/expected/plpython_error.out
--- b/src/pl/plpython/expected/plpython_error.out
*************** return None
*** 108,114 ****
  	LANGUAGE plpythonu;
  SELECT invalid_type_caught('rick');
  NOTICE:  type "test" does not exist
- CONTEXT:  PL/Python function "invalid_type_caught"
   invalid_type_caught 
  ---------------------
   
--- 108,113 ----
*************** return "you''ve been warned"
*** 232,238 ****
  	LANGUAGE plpythonu;
  SELECT nested_warning();
  WARNING:  boom
- CONTEXT:  PL/Python function "nested_warning"
     nested_warning   
  --------------------
   you've been warned
--- 231,236 ----
*************** SELECT specific_exception(2);
*** 336,342 ****
  
  SELECT specific_exception(NULL);
  NOTICE:  Violated the NOT NULL constraint, sqlstate 23502
- CONTEXT:  PL/Python function "specific_exception"
   specific_exception 
  --------------------
   
--- 334,339 ----
*************** CONTEXT:  PL/Python function "specific_e
*** 344,350 ****
  
  SELECT specific_exception(2);
  NOTICE:  Violated the UNIQUE constraint, sqlstate 23505
- CONTEXT:  PL/Python function "specific_exception"
   specific_exception 
  --------------------
   
--- 341,346 ----
diff --git a/src/pl/plpython/expected/plpython_spi.out b/src/pl/plpython/expected/plpython_spi.out
new file mode 100644
index e2861df..e715ee5
*** a/src/pl/plpython/expected/plpython_spi.out
--- b/src/pl/plpython/expected/plpython_spi.out
*************** else:
*** 130,142 ****
  $$ LANGUAGE plpythonu;
  SELECT result_metadata_test($$SELECT 1 AS foo, '11'::text AS bar UNION SELECT 2, '22'$$);
  INFO:  True
- CONTEXT:  PL/Python function "result_metadata_test"
  INFO:  ['foo', 'bar']
- CONTEXT:  PL/Python function "result_metadata_test"
  INFO:  [23, 25]
- CONTEXT:  PL/Python function "result_metadata_test"
  INFO:  [-1, -1]
- CONTEXT:  PL/Python function "result_metadata_test"
   result_metadata_test 
  ----------------------
                      2
--- 130,138 ----
*************** CONTEXT:  PL/Python function "result_met
*** 144,150 ****
  
  SELECT result_metadata_test($$CREATE TEMPORARY TABLE foo1 (a int, b text)$$);
  INFO:  True
- CONTEXT:  PL/Python function "result_metadata_test"
  ERROR:  plpy.Error: command did not produce a result set
  CONTEXT:  Traceback (most recent call last):
    PL/Python function "result_metadata_test", line 6, in <module>
--- 140,145 ----
*************** else:
*** 234,248 ****
  $$ LANGUAGE plpythonu;
  SELECT result_subscript_test();
  INFO:  2
- CONTEXT:  PL/Python function "result_subscript_test"
  INFO:  4
- CONTEXT:  PL/Python function "result_subscript_test"
  INFO:  [2, 3]
- CONTEXT:  PL/Python function "result_subscript_test"
  INFO:  [1, 3]
- CONTEXT:  PL/Python function "result_subscript_test"
  INFO:  [10, 100, 3, 1000]
- CONTEXT:  PL/Python function "result_subscript_test"
   result_subscript_test 
  -----------------------
   
--- 229,238 ----
*************** plpy.info(result[:])
*** 257,263 ****
  $$ LANGUAGE plpythonu;
  SELECT result_empty_test();
  INFO:  []
- CONTEXT:  PL/Python function "result_empty_test"
   result_empty_test 
  -------------------
   
--- 247,252 ----
diff --git a/src/pl/plpython/expected/plpython_subtransaction.out b/src/pl/plpython/expected/plpython_subtransaction.out
new file mode 100644
index ced4682..635bac6
*** a/src/pl/plpython/expected/plpython_subtransaction.out
--- b/src/pl/plpython/expected/plpython_subtransaction.out
*************** SELECT * FROM subtransaction_tbl;
*** 154,160 ****
  TRUNCATE subtransaction_tbl;
  SELECT subtransaction_nested_test('t');
  NOTICE:  Swallowed SyntaxError('syntax error at or near "error"',)
- CONTEXT:  PL/Python function "subtransaction_nested_test"
   subtransaction_nested_test 
  ----------------------------
   ok
--- 154,159 ----
*************** return "ok"
*** 180,188 ****
  $$ LANGUAGE plpythonu;
  SELECT subtransaction_deeply_nested_test();
  NOTICE:  Swallowed SyntaxError('syntax error at or near "error"',)
- CONTEXT:  PL/Python function "subtransaction_nested_test"
- SQL statement "SELECT subtransaction_nested_test('t')"
- PL/Python function "subtransaction_nested_test"
   subtransaction_deeply_nested_test 
  -----------------------------------
   ok
--- 179,184 ----
*************** CONTEXT:  Traceback (most recent call la
*** 251,257 ****
  PL/Python function "subtransaction_exit_without_enter"
  SELECT subtransaction_enter_without_exit();
  WARNING:  forcibly aborting a subtransaction that has not been exited
- CONTEXT:  PL/Python function "subtransaction_enter_without_exit"
   subtransaction_enter_without_exit 
  -----------------------------------
   
--- 247,252 ----
*************** CONTEXT:  PL/Python function "subtransac
*** 259,265 ****
  
  SELECT subtransaction_exit_twice();
  WARNING:  forcibly aborting a subtransaction that has not been exited
- CONTEXT:  PL/Python function "subtransaction_exit_twice"
  ERROR:  ValueError: this subtransaction has not been entered
  CONTEXT:  Traceback (most recent call last):
    PL/Python function "subtransaction_exit_twice", line 3, in <module>
--- 254,259 ----
*************** CONTEXT:  Traceback (most recent call la
*** 267,275 ****
  PL/Python function "subtransaction_exit_twice"
  SELECT subtransaction_enter_twice();
  WARNING:  forcibly aborting a subtransaction that has not been exited
- CONTEXT:  PL/Python function "subtransaction_enter_twice"
  WARNING:  forcibly aborting a subtransaction that has not been exited
- CONTEXT:  PL/Python function "subtransaction_enter_twice"
   subtransaction_enter_twice 
  ----------------------------
   
--- 261,267 ----
*************** CONTEXT:  Traceback (most recent call la
*** 283,289 ****
  PL/Python function "subtransaction_exit_same_subtransaction_twice"
  SELECT subtransaction_enter_same_subtransaction_twice();
  WARNING:  forcibly aborting a subtransaction that has not been exited
- CONTEXT:  PL/Python function "subtransaction_enter_same_subtransaction_twice"
  ERROR:  ValueError: this subtransaction has already been entered
  CONTEXT:  Traceback (most recent call last):
    PL/Python function "subtransaction_enter_same_subtransaction_twice", line 4, in <module>
--- 275,280 ----
*************** except plpy.SPIError:
*** 329,337 ****
  $$ LANGUAGE plpythonu;
  SELECT subtransaction_mix_explicit_and_implicit();
  WARNING:  Caught a SPI error from an explicit subtransaction
- CONTEXT:  PL/Python function "subtransaction_mix_explicit_and_implicit"
  WARNING:  Caught a SPI error
- CONTEXT:  PL/Python function "subtransaction_mix_explicit_and_implicit"
   subtransaction_mix_explicit_and_implicit 
  ------------------------------------------
   
--- 320,326 ----
*************** with plpy.subtransaction():
*** 370,376 ****
  $$ LANGUAGE plpythonu;
  SELECT try_catch_inside_subtransaction();
  NOTICE:  caught
- CONTEXT:  PL/Python function "try_catch_inside_subtransaction"
   try_catch_inside_subtransaction 
  ---------------------------------
   
--- 359,364 ----
*************** with plpy.subtransaction():
*** 395,401 ****
  $$ LANGUAGE plpythonu;
  SELECT pk_violation_inside_subtransaction();
  NOTICE:  caught
- CONTEXT:  PL/Python function "pk_violation_inside_subtransaction"
   pk_violation_inside_subtransaction 
  ------------------------------------
   
--- 383,388 ----
diff --git a/src/pl/plpython/expected/plpython_test.out b/src/pl/plpython/expected/plpython_test.out
new file mode 100644
index a884fc0..7b76faf
*** a/src/pl/plpython/expected/plpython_test.out
--- b/src/pl/plpython/expected/plpython_test.out
*************** plpy.error('error')
*** 62,78 ****
  $$ LANGUAGE plpythonu;
  SELECT elog_test();
  INFO:  info
- CONTEXT:  PL/Python function "elog_test"
  INFO:  37
- CONTEXT:  PL/Python function "elog_test"
  INFO:  ()
- CONTEXT:  PL/Python function "elog_test"
  INFO:  ('info', 37, [1, 2, 3])
- CONTEXT:  PL/Python function "elog_test"
  NOTICE:  notice
- CONTEXT:  PL/Python function "elog_test"
  WARNING:  warning
- CONTEXT:  PL/Python function "elog_test"
  ERROR:  plpy.Error: error
  CONTEXT:  Traceback (most recent call last):
    PL/Python function "elog_test", line 10, in <module>
--- 62,72 ----
diff --git a/src/pl/plpython/expected/plpython_trigger.out b/src/pl/plpython/expected/plpython_trigger.out
new file mode 100644
index 80e478b..4148963
*** a/src/pl/plpython/expected/plpython_trigger.out
--- b/src/pl/plpython/expected/plpython_trigger.out
*************** BEFORE INSERT OR UPDATE OR DELETE OR TRU
*** 98,305 ****
  FOR EACH STATEMENT EXECUTE PROCEDURE trigger_data(23,'skidoo');
  insert into trigger_test values(1,'insert');
  NOTICE:  TD[args] => ['23', 'skidoo']
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[event] => INSERT
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[level] => STATEMENT
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[name] => show_trigger_data_trig_stmt
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[new] => None
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[old] => None
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[relid] => bogus:12345
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_name] => trigger_test
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_schema] => public
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[when] => BEFORE
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[args] => ['23', 'skidoo']
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[event] => INSERT
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[level] => ROW
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[name] => show_trigger_data_trig_before
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[new] => {'i': 1, 'v': 'insert'}
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[old] => None
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[relid] => bogus:12345
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_name] => trigger_test
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_schema] => public
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[when] => BEFORE
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[args] => ['23', 'skidoo']
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[event] => INSERT
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[level] => ROW
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[name] => show_trigger_data_trig_after
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[new] => {'i': 1, 'v': 'insert'}
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[old] => None
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[relid] => bogus:12345
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_name] => trigger_test
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_schema] => public
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[when] => AFTER
- CONTEXT:  PL/Python function "trigger_data"
  update trigger_test set v = 'update' where i = 1;
  NOTICE:  TD[args] => ['23', 'skidoo']
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[event] => UPDATE
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[level] => STATEMENT
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[name] => show_trigger_data_trig_stmt
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[new] => None
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[old] => None
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[relid] => bogus:12345
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_name] => trigger_test
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_schema] => public
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[when] => BEFORE
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[args] => ['23', 'skidoo']
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[event] => UPDATE
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[level] => ROW
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[name] => show_trigger_data_trig_before
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[new] => {'i': 1, 'v': 'update'}
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[old] => {'i': 1, 'v': 'insert'}
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[relid] => bogus:12345
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_name] => trigger_test
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_schema] => public
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[when] => BEFORE
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[args] => ['23', 'skidoo']
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[event] => UPDATE
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[level] => ROW
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[name] => show_trigger_data_trig_after
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[new] => {'i': 1, 'v': 'update'}
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[old] => {'i': 1, 'v': 'insert'}
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[relid] => bogus:12345
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_name] => trigger_test
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_schema] => public
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[when] => AFTER
- CONTEXT:  PL/Python function "trigger_data"
  delete from trigger_test;
  NOTICE:  TD[args] => ['23', 'skidoo']
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[event] => DELETE
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[level] => STATEMENT
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[name] => show_trigger_data_trig_stmt
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[new] => None
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[old] => None
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[relid] => bogus:12345
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_name] => trigger_test
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_schema] => public
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[when] => BEFORE
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[args] => ['23', 'skidoo']
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[event] => DELETE
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[level] => ROW
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[name] => show_trigger_data_trig_before
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[new] => None
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[old] => {'i': 1, 'v': 'update'}
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[relid] => bogus:12345
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_name] => trigger_test
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_schema] => public
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[when] => BEFORE
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[args] => ['23', 'skidoo']
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[event] => DELETE
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[level] => ROW
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[name] => show_trigger_data_trig_after
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[new] => None
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[old] => {'i': 1, 'v': 'update'}
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[relid] => bogus:12345
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_name] => trigger_test
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_schema] => public
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[when] => AFTER
- CONTEXT:  PL/Python function "trigger_data"
  truncate table trigger_test;
  NOTICE:  TD[args] => ['23', 'skidoo']
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[event] => TRUNCATE
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[level] => STATEMENT
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[name] => show_trigger_data_trig_stmt
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[new] => None
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[old] => None
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[relid] => bogus:12345
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_name] => trigger_test
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_schema] => public
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[when] => BEFORE
- CONTEXT:  PL/Python function "trigger_data"
  DROP TRIGGER show_trigger_data_trig_stmt on trigger_test;
  DROP TRIGGER show_trigger_data_trig_before on trigger_test;
  DROP TRIGGER show_trigger_data_trig_after on trigger_test;
--- 98,205 ----
*************** INSTEAD OF INSERT OR UPDATE OR DELETE ON
*** 310,376 ****
  FOR EACH ROW EXECUTE PROCEDURE trigger_data(24,'skidoo view');
  insert into trigger_test_view values(2,'insert');
  NOTICE:  TD[args] => ['24', 'skidoo view']
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[event] => INSERT
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[level] => ROW
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[name] => show_trigger_data_trig
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[new] => {'i': 2, 'v': 'insert'}
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[old] => None
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[relid] => bogus:12345
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_name] => trigger_test_view
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_schema] => public
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[when] => INSTEAD OF
- CONTEXT:  PL/Python function "trigger_data"
  update trigger_test_view set v = 'update' where i = 1;
  NOTICE:  TD[args] => ['24', 'skidoo view']
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[event] => UPDATE
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[level] => ROW
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[name] => show_trigger_data_trig
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[new] => {'i': 1, 'v': 'update'}
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[old] => {'i': 1, 'v': 'insert'}
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[relid] => bogus:12345
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_name] => trigger_test_view
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_schema] => public
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[when] => INSTEAD OF
- CONTEXT:  PL/Python function "trigger_data"
  delete from trigger_test_view;
  NOTICE:  TD[args] => ['24', 'skidoo view']
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[event] => DELETE
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[level] => ROW
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[name] => show_trigger_data_trig
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[new] => None
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[old] => {'i': 1, 'v': 'insert'}
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[relid] => bogus:12345
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_name] => trigger_test_view
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[table_schema] => public
- CONTEXT:  PL/Python function "trigger_data"
  NOTICE:  TD[when] => INSTEAD OF
- CONTEXT:  PL/Python function "trigger_data"
  DROP FUNCTION trigger_data() CASCADE;
  NOTICE:  drop cascades to trigger show_trigger_data_trig on view trigger_test_view
  DROP VIEW trigger_test_view;
--- 210,246 ----
*************** BEFORE DELETE ON trigger_test
*** 402,408 ****
  FOR EACH ROW EXECUTE PROCEDURE stupid2();
  DELETE FROM trigger_test WHERE i = 0;
  WARNING:  PL/Python trigger function returned "MODIFY" in a DELETE trigger -- ignored
- CONTEXT:  PL/Python function "stupid2"
  DROP TRIGGER stupid_trigger2 ON trigger_test;
  INSERT INTO trigger_test VALUES (0, 'zero');
  -- returning unrecognized string from trigger function
--- 272,277 ----
diff --git a/src/pl/plpython/expected/plpython_types.out b/src/pl/plpython/expected/plpython_types.out
new file mode 100644
index 17057a5..f0b6abd
*** a/src/pl/plpython/expected/plpython_types.out
--- b/src/pl/plpython/expected/plpython_types.out
*************** return x
*** 10,16 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_bool(true);
  INFO:  (True, <type 'bool'>)
- CONTEXT:  PL/Python function "test_type_conversion_bool"
   test_type_conversion_bool 
  ---------------------------
   t
--- 10,15 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 18,24 ****
  
  SELECT * FROM test_type_conversion_bool(false);
  INFO:  (False, <type 'bool'>)
- CONTEXT:  PL/Python function "test_type_conversion_bool"
   test_type_conversion_bool 
  ---------------------------
   f
--- 17,22 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 26,32 ****
  
  SELECT * FROM test_type_conversion_bool(null);
  INFO:  (None, <type 'NoneType'>)
- CONTEXT:  PL/Python function "test_type_conversion_bool"
   test_type_conversion_bool 
  ---------------------------
   
--- 24,29 ----
*************** return ret
*** 54,60 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_bool_other(0);
  INFO:  (0, False)
- CONTEXT:  PL/Python function "test_type_conversion_bool_other"
   test_type_conversion_bool_other 
  ---------------------------------
   f
--- 51,56 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 62,68 ****
  
  SELECT * FROM test_type_conversion_bool_other(1);
  INFO:  (5, True)
- CONTEXT:  PL/Python function "test_type_conversion_bool_other"
   test_type_conversion_bool_other 
  ---------------------------------
   t
--- 58,63 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 70,76 ****
  
  SELECT * FROM test_type_conversion_bool_other(2);
  INFO:  ('', False)
- CONTEXT:  PL/Python function "test_type_conversion_bool_other"
   test_type_conversion_bool_other 
  ---------------------------------
   f
--- 65,70 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 78,84 ****
  
  SELECT * FROM test_type_conversion_bool_other(3);
  INFO:  ('fa', True)
- CONTEXT:  PL/Python function "test_type_conversion_bool_other"
   test_type_conversion_bool_other 
  ---------------------------------
   t
--- 72,77 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 86,92 ****
  
  SELECT * FROM test_type_conversion_bool_other(4);
  INFO:  ([], False)
- CONTEXT:  PL/Python function "test_type_conversion_bool_other"
   test_type_conversion_bool_other 
  ---------------------------------
   f
--- 79,84 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 94,100 ****
  
  SELECT * FROM test_type_conversion_bool_other(5);
  INFO:  ([0], True)
- CONTEXT:  PL/Python function "test_type_conversion_bool_other"
   test_type_conversion_bool_other 
  ---------------------------------
   t
--- 86,91 ----
*************** return x
*** 106,112 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_char('a');
  INFO:  ('a', <type 'str'>)
- CONTEXT:  PL/Python function "test_type_conversion_char"
   test_type_conversion_char 
  ---------------------------
   a
--- 97,102 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 114,120 ****
  
  SELECT * FROM test_type_conversion_char(null);
  INFO:  (None, <type 'NoneType'>)
- CONTEXT:  PL/Python function "test_type_conversion_char"
   test_type_conversion_char 
  ---------------------------
   
--- 104,109 ----
*************** return x
*** 126,132 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_int2(100::int2);
  INFO:  (100, <type 'int'>)
- CONTEXT:  PL/Python function "test_type_conversion_int2"
   test_type_conversion_int2 
  ---------------------------
                         100
--- 115,120 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 134,140 ****
  
  SELECT * FROM test_type_conversion_int2(-100::int2);
  INFO:  (-100, <type 'int'>)
- CONTEXT:  PL/Python function "test_type_conversion_int2"
   test_type_conversion_int2 
  ---------------------------
                        -100
--- 122,127 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 142,148 ****
  
  SELECT * FROM test_type_conversion_int2(null);
  INFO:  (None, <type 'NoneType'>)
- CONTEXT:  PL/Python function "test_type_conversion_int2"
   test_type_conversion_int2 
  ---------------------------
                            
--- 129,134 ----
*************** return x
*** 154,160 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_int4(100);
  INFO:  (100, <type 'int'>)
- CONTEXT:  PL/Python function "test_type_conversion_int4"
   test_type_conversion_int4 
  ---------------------------
                         100
--- 140,145 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 162,168 ****
  
  SELECT * FROM test_type_conversion_int4(-100);
  INFO:  (-100, <type 'int'>)
- CONTEXT:  PL/Python function "test_type_conversion_int4"
   test_type_conversion_int4 
  ---------------------------
                        -100
--- 147,152 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 170,176 ****
  
  SELECT * FROM test_type_conversion_int4(null);
  INFO:  (None, <type 'NoneType'>)
- CONTEXT:  PL/Python function "test_type_conversion_int4"
   test_type_conversion_int4 
  ---------------------------
                            
--- 154,159 ----
*************** return x
*** 182,188 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_int8(100);
  INFO:  (100L, <type 'long'>)
- CONTEXT:  PL/Python function "test_type_conversion_int8"
   test_type_conversion_int8 
  ---------------------------
                         100
--- 165,170 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 190,196 ****
  
  SELECT * FROM test_type_conversion_int8(-100);
  INFO:  (-100L, <type 'long'>)
- CONTEXT:  PL/Python function "test_type_conversion_int8"
   test_type_conversion_int8 
  ---------------------------
                        -100
--- 172,177 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 198,204 ****
  
  SELECT * FROM test_type_conversion_int8(5000000000);
  INFO:  (5000000000L, <type 'long'>)
- CONTEXT:  PL/Python function "test_type_conversion_int8"
   test_type_conversion_int8 
  ---------------------------
                  5000000000
--- 179,184 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 206,212 ****
  
  SELECT * FROM test_type_conversion_int8(null);
  INFO:  (None, <type 'NoneType'>)
- CONTEXT:  PL/Python function "test_type_conversion_int8"
   test_type_conversion_int8 
  ---------------------------
                            
--- 186,191 ----
*************** return x
*** 220,226 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_numeric(100);
  INFO:  ('100', 'Decimal')
- CONTEXT:  PL/Python function "test_type_conversion_numeric"
   test_type_conversion_numeric 
  ------------------------------
                            100
--- 199,204 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 228,234 ****
  
  SELECT * FROM test_type_conversion_numeric(-100);
  INFO:  ('-100', 'Decimal')
- CONTEXT:  PL/Python function "test_type_conversion_numeric"
   test_type_conversion_numeric 
  ------------------------------
                           -100
--- 206,211 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 236,242 ****
  
  SELECT * FROM test_type_conversion_numeric(100.0);
  INFO:  ('100.0', 'Decimal')
- CONTEXT:  PL/Python function "test_type_conversion_numeric"
   test_type_conversion_numeric 
  ------------------------------
                          100.0
--- 213,218 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 244,250 ****
  
  SELECT * FROM test_type_conversion_numeric(100.00);
  INFO:  ('100.00', 'Decimal')
- CONTEXT:  PL/Python function "test_type_conversion_numeric"
   test_type_conversion_numeric 
  ------------------------------
                         100.00
--- 220,225 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 252,258 ****
  
  SELECT * FROM test_type_conversion_numeric(5000000000.5);
  INFO:  ('5000000000.5', 'Decimal')
- CONTEXT:  PL/Python function "test_type_conversion_numeric"
   test_type_conversion_numeric 
  ------------------------------
                   5000000000.5
--- 227,232 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 260,266 ****
  
  SELECT * FROM test_type_conversion_numeric(1234567890.0987654321);
  INFO:  ('1234567890.0987654321', 'Decimal')
- CONTEXT:  PL/Python function "test_type_conversion_numeric"
   test_type_conversion_numeric 
  ------------------------------
          1234567890.0987654321
--- 234,239 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 268,274 ****
  
  SELECT * FROM test_type_conversion_numeric(-1234567890.0987654321);
  INFO:  ('-1234567890.0987654321', 'Decimal')
- CONTEXT:  PL/Python function "test_type_conversion_numeric"
   test_type_conversion_numeric 
  ------------------------------
         -1234567890.0987654321
--- 241,246 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 276,282 ****
  
  SELECT * FROM test_type_conversion_numeric(null);
  INFO:  ('None', 'NoneType')
- CONTEXT:  PL/Python function "test_type_conversion_numeric"
   test_type_conversion_numeric 
  ------------------------------
                               
--- 248,253 ----
*************** return x
*** 288,294 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_float4(100);
  INFO:  (100.0, <type 'float'>)
- CONTEXT:  PL/Python function "test_type_conversion_float4"
   test_type_conversion_float4 
  -----------------------------
                           100
--- 259,264 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 296,302 ****
  
  SELECT * FROM test_type_conversion_float4(-100);
  INFO:  (-100.0, <type 'float'>)
- CONTEXT:  PL/Python function "test_type_conversion_float4"
   test_type_conversion_float4 
  -----------------------------
                          -100
--- 266,271 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 304,310 ****
  
  SELECT * FROM test_type_conversion_float4(5000.5);
  INFO:  (5000.5, <type 'float'>)
- CONTEXT:  PL/Python function "test_type_conversion_float4"
   test_type_conversion_float4 
  -----------------------------
                        5000.5
--- 273,278 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 312,318 ****
  
  SELECT * FROM test_type_conversion_float4(null);
  INFO:  (None, <type 'NoneType'>)
- CONTEXT:  PL/Python function "test_type_conversion_float4"
   test_type_conversion_float4 
  -----------------------------
                              
--- 280,285 ----
*************** return x
*** 324,330 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_float8(100);
  INFO:  (100.0, <type 'float'>)
- CONTEXT:  PL/Python function "test_type_conversion_float8"
   test_type_conversion_float8 
  -----------------------------
                           100
--- 291,296 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 332,338 ****
  
  SELECT * FROM test_type_conversion_float8(-100);
  INFO:  (-100.0, <type 'float'>)
- CONTEXT:  PL/Python function "test_type_conversion_float8"
   test_type_conversion_float8 
  -----------------------------
                          -100
--- 298,303 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 340,346 ****
  
  SELECT * FROM test_type_conversion_float8(5000000000.5);
  INFO:  (5000000000.5, <type 'float'>)
- CONTEXT:  PL/Python function "test_type_conversion_float8"
   test_type_conversion_float8 
  -----------------------------
                  5000000000.5
--- 305,310 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 348,354 ****
  
  SELECT * FROM test_type_conversion_float8(null);
  INFO:  (None, <type 'NoneType'>)
- CONTEXT:  PL/Python function "test_type_conversion_float8"
   test_type_conversion_float8 
  -----------------------------
                              
--- 312,317 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 356,362 ****
  
  SELECT * FROM test_type_conversion_float8(100100100.654321);
  INFO:  (100100100.654321, <type 'float'>)
- CONTEXT:  PL/Python function "test_type_conversion_float8"
   test_type_conversion_float8 
  -----------------------------
              100100100.654321
--- 319,324 ----
*************** return x
*** 368,374 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_oid(100);
  INFO:  (100L, <type 'long'>)
- CONTEXT:  PL/Python function "test_type_conversion_oid"
   test_type_conversion_oid 
  --------------------------
                        100
--- 330,335 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 376,382 ****
  
  SELECT * FROM test_type_conversion_oid(2147483649);
  INFO:  (2147483649L, <type 'long'>)
- CONTEXT:  PL/Python function "test_type_conversion_oid"
   test_type_conversion_oid 
  --------------------------
                 2147483649
--- 337,342 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 384,390 ****
  
  SELECT * FROM test_type_conversion_oid(null);
  INFO:  (None, <type 'NoneType'>)
- CONTEXT:  PL/Python function "test_type_conversion_oid"
   test_type_conversion_oid 
  --------------------------
                           
--- 344,349 ----
*************** return x
*** 396,402 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_text('hello world');
  INFO:  ('hello world', <type 'str'>)
- CONTEXT:  PL/Python function "test_type_conversion_text"
   test_type_conversion_text 
  ---------------------------
   hello world
--- 355,360 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 404,410 ****
  
  SELECT * FROM test_type_conversion_text(null);
  INFO:  (None, <type 'NoneType'>)
- CONTEXT:  PL/Python function "test_type_conversion_text"
   test_type_conversion_text 
  ---------------------------
   
--- 362,367 ----
*************** return x
*** 416,422 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_bytea('hello world');
  INFO:  ('hello world', <type 'str'>)
- CONTEXT:  PL/Python function "test_type_conversion_bytea"
   test_type_conversion_bytea 
  ----------------------------
   \x68656c6c6f20776f726c64
--- 373,378 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 424,430 ****
  
  SELECT * FROM test_type_conversion_bytea(E'null\\000byte');
  INFO:  ('null\x00byte', <type 'str'>)
- CONTEXT:  PL/Python function "test_type_conversion_bytea"
   test_type_conversion_bytea 
  ----------------------------
   \x6e756c6c0062797465
--- 380,385 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 432,438 ****
  
  SELECT * FROM test_type_conversion_bytea(null);
  INFO:  (None, <type 'NoneType'>)
- CONTEXT:  PL/Python function "test_type_conversion_bytea"
   test_type_conversion_bytea 
  ----------------------------
   
--- 387,392 ----
*************** return y
*** 481,487 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_uint2(100::uint2, 50);
  INFO:  (100, <type 'int'>)
- CONTEXT:  PL/Python function "test_type_conversion_uint2"
   test_type_conversion_uint2 
  ----------------------------
                           50
--- 435,440 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 489,501 ****
  
  SELECT * FROM test_type_conversion_uint2(100::uint2, -50);
  INFO:  (100, <type 'int'>)
- CONTEXT:  PL/Python function "test_type_conversion_uint2"
  ERROR:  value for domain uint2 violates check constraint "uint2_check"
  CONTEXT:  while creating return value
  PL/Python function "test_type_conversion_uint2"
  SELECT * FROM test_type_conversion_uint2(null, 1);
  INFO:  (None, <type 'NoneType'>)
- CONTEXT:  PL/Python function "test_type_conversion_uint2"
   test_type_conversion_uint2 
  ----------------------------
                            1
--- 442,452 ----
*************** return y
*** 524,530 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_bytea10('hello wold', 'hello wold');
  INFO:  ('hello wold', <type 'str'>)
- CONTEXT:  PL/Python function "test_type_conversion_bytea10"
   test_type_conversion_bytea10 
  ------------------------------
   \x68656c6c6f20776f6c64
--- 475,480 ----
*************** SELECT * FROM test_type_conversion_bytea
*** 534,540 ****
  ERROR:  value for domain bytea10 violates check constraint "bytea10_check"
  SELECT * FROM test_type_conversion_bytea10('hello word', 'hello world');
  INFO:  ('hello word', <type 'str'>)
- CONTEXT:  PL/Python function "test_type_conversion_bytea10"
  ERROR:  value for domain bytea10 violates check constraint "bytea10_check"
  CONTEXT:  while creating return value
  PL/Python function "test_type_conversion_bytea10"
--- 484,489 ----
*************** SELECT * FROM test_type_conversion_bytea
*** 542,548 ****
  ERROR:  value for domain bytea10 violates check constraint "bytea10_check"
  SELECT * FROM test_type_conversion_bytea10('hello word', null);
  INFO:  ('hello word', <type 'str'>)
- CONTEXT:  PL/Python function "test_type_conversion_bytea10"
  ERROR:  value for domain bytea10 violates check constraint "bytea10_check"
  CONTEXT:  while creating return value
  PL/Python function "test_type_conversion_bytea10"
--- 491,496 ----
*************** return x
*** 555,561 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_array_int4(ARRAY[0, 100]);
  INFO:  ([0, 100], <type 'list'>)
- CONTEXT:  PL/Python function "test_type_conversion_array_int4"
   test_type_conversion_array_int4 
  ---------------------------------
   {0,100}
--- 503,508 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 563,569 ****
  
  SELECT * FROM test_type_conversion_array_int4(ARRAY[0,-100,55]);
  INFO:  ([0, -100, 55], <type 'list'>)
- CONTEXT:  PL/Python function "test_type_conversion_array_int4"
   test_type_conversion_array_int4 
  ---------------------------------
   {0,-100,55}
--- 510,515 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 571,577 ****
  
  SELECT * FROM test_type_conversion_array_int4(ARRAY[NULL,1]);
  INFO:  ([None, 1], <type 'list'>)
- CONTEXT:  PL/Python function "test_type_conversion_array_int4"
   test_type_conversion_array_int4 
  ---------------------------------
   {NULL,1}
--- 517,522 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 579,585 ****
  
  SELECT * FROM test_type_conversion_array_int4(ARRAY[]::integer[]);
  INFO:  ([], <type 'list'>)
- CONTEXT:  PL/Python function "test_type_conversion_array_int4"
   test_type_conversion_array_int4 
  ---------------------------------
   {}
--- 524,529 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 587,593 ****
  
  SELECT * FROM test_type_conversion_array_int4(NULL);
  INFO:  (None, <type 'NoneType'>)
- CONTEXT:  PL/Python function "test_type_conversion_array_int4"
   test_type_conversion_array_int4 
  ---------------------------------
   
--- 531,536 ----
*************** return x
*** 603,609 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_array_text(ARRAY['foo', 'bar']);
  INFO:  (['foo', 'bar'], <type 'list'>)
- CONTEXT:  PL/Python function "test_type_conversion_array_text"
   test_type_conversion_array_text 
  ---------------------------------
   {foo,bar}
--- 546,551 ----
*************** return x
*** 615,621 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_array_bytea(ARRAY[E'\\xdeadbeef'::bytea, NULL]);
  INFO:  (['\xde\xad\xbe\xef', None], <type 'list'>)
- CONTEXT:  PL/Python function "test_type_conversion_array_bytea"
   test_type_conversion_array_bytea 
  ----------------------------------
   {"\\xdeadbeef",NULL}
--- 557,562 ----
*************** return x
*** 681,687 ****
  $$ LANGUAGE plpythonu;
  SELECT * FROM test_type_conversion_array_domain(ARRAY[0, 100]::ordered_pair_domain);
  INFO:  ([0, 100], <type 'list'>)
- CONTEXT:  PL/Python function "test_type_conversion_array_domain"
   test_type_conversion_array_domain 
  -----------------------------------
   {0,100}
--- 622,627 ----
*************** CONTEXT:  PL/Python function "test_type_
*** 689,695 ****
  
  SELECT * FROM test_type_conversion_array_domain(NULL::ordered_pair_domain);
  INFO:  (None, <type 'NoneType'>)
- CONTEXT:  PL/Python function "test_type_conversion_array_domain"
   test_type_conversion_array_domain 
  -----------------------------------
   
--- 629,634 ----
*************** return rv[0]['val']
*** 783,789 ****
  $$;
  SELECT test_prep_bool_output(); -- false
  INFO:  {'val': False}
- CONTEXT:  PL/Python function "test_prep_bool_output"
   test_prep_bool_output 
  -----------------------
   f
--- 722,727 ----
*************** return rv[0]['val']
*** 812,818 ****
  $$;
  SELECT test_prep_bytea_output();
  INFO:  {'val': '\xaa\x00\xbb'}
- CONTEXT:  PL/Python function "test_prep_bytea_output"
   test_prep_bytea_output 
  ------------------------
   \xaa00bb
--- 750,755 ----
diff --git a/src/test/regress/expected/copy2.out b/src/test/regress/expected/copy2.out
new file mode 100644
index 5e31737..72ada21
*** a/src/test/regress/expected/copy2.out
--- b/src/test/regress/expected/copy2.out
*************** Check constraints:
*** 447,458 ****
  
  copy check_con_tbl from stdin;
  NOTICE:  input = {"f1":1}
- CONTEXT:  COPY check_con_tbl, line 1: "1"
  NOTICE:  input = {"f1":null}
- CONTEXT:  COPY check_con_tbl, line 2: "\N"
  copy check_con_tbl from stdin;
  NOTICE:  input = {"f1":0}
- CONTEXT:  COPY check_con_tbl, line 1: "0"
  ERROR:  new row for relation "check_con_tbl" violates check constraint "check_con_tbl_check"
  DETAIL:  Failing row contains (0).
  CONTEXT:  COPY check_con_tbl, line 1: "0"
--- 447,455 ----
diff --git a/src/test/regress/expected/event_trigger.out b/src/test/regress/expected/event_trigger.out
new file mode 100644
index e70c315..05ac0ad
*** a/src/test/regress/expected/event_trigger.out
--- b/src/test/regress/expected/event_trigger.out
*************** drop cascades to table schema_one.table_
*** 234,248 ****
  drop cascades to table schema_one."table two"
  drop cascades to table schema_one.table_three
  NOTICE:  table "schema_two_table_two" does not exist, skipping
- CONTEXT:  SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_two"
- PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
  NOTICE:  table "audit_tbls_schema_two_table_three" does not exist, skipping
- CONTEXT:  SQL statement "DROP TABLE IF EXISTS audit_tbls.audit_tbls_schema_two_table_three"
- PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
- SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_three"
- PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
  ERROR:  object audit_tbls.schema_two_table_three of type table cannot be dropped
! CONTEXT:  SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_three"
  PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
  DELETE FROM undroppable_objs WHERE object_identity = 'audit_tbls.schema_two_table_three';
  DROP SCHEMA schema_one, schema_two CASCADE;
--- 234,243 ----
  drop cascades to table schema_one."table two"
  drop cascades to table schema_one.table_three
  NOTICE:  table "schema_two_table_two" does not exist, skipping
  NOTICE:  table "audit_tbls_schema_two_table_three" does not exist, skipping
  ERROR:  object audit_tbls.schema_two_table_three of type table cannot be dropped
! CONTEXT:  PL/pgSQL function undroppable() line 14 at RAISE
! SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_three"
  PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
  DELETE FROM undroppable_objs WHERE object_identity = 'audit_tbls.schema_two_table_three';
  DROP SCHEMA schema_one, schema_two CASCADE;
*************** drop cascades to table schema_one.table_
*** 255,277 ****
  drop cascades to table schema_one."table two"
  drop cascades to table schema_one.table_three
  NOTICE:  table "schema_two_table_two" does not exist, skipping
- CONTEXT:  SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_two"
- PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
  NOTICE:  table "audit_tbls_schema_two_table_three" does not exist, skipping
- CONTEXT:  SQL statement "DROP TABLE IF EXISTS audit_tbls.audit_tbls_schema_two_table_three"
- PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
- SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_three"
- PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
  NOTICE:  table "schema_one_table_one" does not exist, skipping
- CONTEXT:  SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_one_table_one"
- PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
  NOTICE:  table "schema_one_table two" does not exist, skipping
- CONTEXT:  SQL statement "DROP TABLE IF EXISTS audit_tbls."schema_one_table two""
- PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
  NOTICE:  table "schema_one_table_three" does not exist, skipping
- CONTEXT:  SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_one_table_three"
- PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
  ERROR:  object schema_one.table_three of type table cannot be dropped
  DELETE FROM undroppable_objs WHERE object_identity = 'schema_one.table_three';
  DROP SCHEMA schema_one, schema_two CASCADE;
  NOTICE:  drop cascades to 7 other objects
--- 250,261 ----
  drop cascades to table schema_one."table two"
  drop cascades to table schema_one.table_three
  NOTICE:  table "schema_two_table_two" does not exist, skipping
  NOTICE:  table "audit_tbls_schema_two_table_three" does not exist, skipping
  NOTICE:  table "schema_one_table_one" does not exist, skipping
  NOTICE:  table "schema_one_table two" does not exist, skipping
  NOTICE:  table "schema_one_table_three" does not exist, skipping
  ERROR:  object schema_one.table_three of type table cannot be dropped
+ CONTEXT:  PL/pgSQL function undroppable() line 14 at RAISE
  DELETE FROM undroppable_objs WHERE object_identity = 'schema_one.table_three';
  DROP SCHEMA schema_one, schema_two CASCADE;
  NOTICE:  drop cascades to 7 other objects
*************** drop cascades to table schema_one.table_
*** 283,304 ****
  drop cascades to table schema_one."table two"
  drop cascades to table schema_one.table_three
  NOTICE:  table "schema_two_table_two" does not exist, skipping
- CONTEXT:  SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_two"
- PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
  NOTICE:  table "audit_tbls_schema_two_table_three" does not exist, skipping
- CONTEXT:  SQL statement "DROP TABLE IF EXISTS audit_tbls.audit_tbls_schema_two_table_three"
- PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
- SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_three"
- PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
  NOTICE:  table "schema_one_table_one" does not exist, skipping
- CONTEXT:  SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_one_table_one"
- PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
  NOTICE:  table "schema_one_table two" does not exist, skipping
- CONTEXT:  SQL statement "DROP TABLE IF EXISTS audit_tbls."schema_one_table two""
- PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
  NOTICE:  table "schema_one_table_three" does not exist, skipping
- CONTEXT:  SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_one_table_three"
- PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
  SELECT * FROM dropped_objects WHERE schema IS NULL OR schema <> 'pg_toast';
       type     |   schema   |               object                
  --------------+------------+-------------------------------------
--- 267,276 ----
*************** SELECT * FROM dropped_objects WHERE sche
*** 329,336 ****
  
  DROP OWNED BY regression_bob;
  NOTICE:  schema "audit_tbls" does not exist, skipping
- CONTEXT:  SQL statement "DROP TABLE IF EXISTS audit_tbls.audit_tbls_schema_one_table_two"
- PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE statement
  SELECT * FROM dropped_objects WHERE type = 'schema';
    type  | schema |   object   
  --------+--------+------------
--- 301,306 ----
*************** insert into rewriteme
*** 402,409 ****
--- 372,381 ----
       select x * 1.001 from generate_series(1, 500) as t(x);
  alter table rewriteme alter column foo type numeric;
  ERROR:  I'm sorry Sir, No Rewrite Allowed.
+ CONTEXT:  PL/pgSQL function test_evtrig_no_rewrite() line 3 at RAISE
  alter table rewriteme add column baz int default 0;
  ERROR:  I'm sorry Sir, No Rewrite Allowed.
+ CONTEXT:  PL/pgSQL function test_evtrig_no_rewrite() line 3 at RAISE
  -- test with more than one reason to rewrite a single table
  CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger
  LANGUAGE plpgsql AS $$
diff --git a/src/test/regress/expected/plancache.out b/src/test/regress/expected/plancache.out
new file mode 100644
index 864f70f..3f3db33
*** a/src/test/regress/expected/plancache.out
--- b/src/test/regress/expected/plancache.out
*************** begin
*** 234,241 ****
  end$$ language plpgsql;
  select cachebug();
  NOTICE:  table "temptable" does not exist, skipping
- CONTEXT:  SQL statement "drop table if exists temptable cascade"
- PL/pgSQL function cachebug() line 4 at SQL statement
  NOTICE:  1
  NOTICE:  2
  NOTICE:  3
--- 234,239 ----
*************** NOTICE:  3
*** 246,253 ****
  
  select cachebug();
  NOTICE:  drop cascades to view vv
- CONTEXT:  SQL statement "drop table if exists temptable cascade"
- PL/pgSQL function cachebug() line 4 at SQL statement
  NOTICE:  1
  NOTICE:  2
  NOTICE:  3
--- 244,249 ----
diff --git a/src/test/regress/expected/plpgsql.out b/src/test/regress/expected/plpgsql.out
new file mode 100644
index 7ce5415..a19424d
*** a/src/test/regress/expected/plpgsql.out
--- b/src/test/regress/expected/plpgsql.out
*************** ERROR:  duplicate key value violates uni
*** 1518,1544 ****
  DETAIL:  Key (name)=(PF1_1) already exists.
  update PSlot set backlink = 'WS.not.there' where slotname = 'PS.base.a1';
  ERROR:  WS.not.there         does not exist
! CONTEXT:  PL/pgSQL function tg_backlink_a() line 17 at assignment
  update PSlot set backlink = 'XX.illegal' where slotname = 'PS.base.a1';
  ERROR:  illegal backlink beginning with XX
! CONTEXT:  PL/pgSQL function tg_backlink_a() line 17 at assignment
  update PSlot set slotlink = 'PS.not.there' where slotname = 'PS.base.a1';
  ERROR:  PS.not.there         does not exist
! CONTEXT:  PL/pgSQL function tg_slotlink_a() line 17 at assignment
  update PSlot set slotlink = 'XX.illegal' where slotname = 'PS.base.a1';
  ERROR:  illegal slotlink beginning with XX
! CONTEXT:  PL/pgSQL function tg_slotlink_a() line 17 at assignment
  insert into HSlot values ('HS', 'base.hub1', 1, '');
  ERROR:  duplicate key value violates unique constraint "hslot_name"
  DETAIL:  Key (slotname)=(HS.base.hub1.1      ) already exists.
  insert into HSlot values ('HS', 'base.hub1', 20, '');
  ERROR:  no manual manipulation of HSlot
  delete from HSlot;
  ERROR:  no manual manipulation of HSlot
  insert into IFace values ('IF', 'notthere', 'eth0', '');
  ERROR:  system "notthere" does not exist
  insert into IFace values ('IF', 'orion', 'ethernet_interface_name_too_long', '');
  ERROR:  IFace slotname "IF.orion.ethernet_interface_name_too_long" too long (20 char max)
  --
  -- The following tests are unrelated to the scenario outlined above;
  -- they merely exercise specific parts of PL/pgSQL
--- 1518,1552 ----
  DETAIL:  Key (name)=(PF1_1) already exists.
  update PSlot set backlink = 'WS.not.there' where slotname = 'PS.base.a1';
  ERROR:  WS.not.there         does not exist
! CONTEXT:  PL/pgSQL function tg_backlink_set(character,character) line 30 at RAISE
! PL/pgSQL function tg_backlink_a() line 17 at assignment
  update PSlot set backlink = 'XX.illegal' where slotname = 'PS.base.a1';
  ERROR:  illegal backlink beginning with XX
! CONTEXT:  PL/pgSQL function tg_backlink_set(character,character) line 47 at RAISE
! PL/pgSQL function tg_backlink_a() line 17 at assignment
  update PSlot set slotlink = 'PS.not.there' where slotname = 'PS.base.a1';
  ERROR:  PS.not.there         does not exist
! CONTEXT:  PL/pgSQL function tg_slotlink_set(character,character) line 30 at RAISE
! PL/pgSQL function tg_slotlink_a() line 17 at assignment
  update PSlot set slotlink = 'XX.illegal' where slotname = 'PS.base.a1';
  ERROR:  illegal slotlink beginning with XX
! CONTEXT:  PL/pgSQL function tg_slotlink_set(character,character) line 77 at RAISE
! PL/pgSQL function tg_slotlink_a() line 17 at assignment
  insert into HSlot values ('HS', 'base.hub1', 1, '');
  ERROR:  duplicate key value violates unique constraint "hslot_name"
  DETAIL:  Key (slotname)=(HS.base.hub1.1      ) already exists.
  insert into HSlot values ('HS', 'base.hub1', 20, '');
  ERROR:  no manual manipulation of HSlot
+ CONTEXT:  PL/pgSQL function tg_hslot_biu() line 12 at RAISE
  delete from HSlot;
  ERROR:  no manual manipulation of HSlot
+ CONTEXT:  PL/pgSQL function tg_hslot_bd() line 12 at RAISE
  insert into IFace values ('IF', 'notthere', 'eth0', '');
  ERROR:  system "notthere" does not exist
+ CONTEXT:  PL/pgSQL function tg_iface_biu() line 8 at RAISE
  insert into IFace values ('IF', 'orion', 'ethernet_interface_name_too_long', '');
  ERROR:  IFace slotname "IF.orion.ethernet_interface_name_too_long" too long (20 char max)
+ CONTEXT:  PL/pgSQL function tg_iface_biu() line 14 at RAISE
  --
  -- The following tests are unrelated to the scenario outlined above;
  -- they merely exercise specific parts of PL/pgSQL
*************** NOTICE:  should see this
*** 1963,1968 ****
--- 1971,1977 ----
  NOTICE:  should see this only if -100 <> 0
  NOTICE:  should see this only if -100 fits in smallint
  ERROR:  -100 is less than zero
+ CONTEXT:  PL/pgSQL function trap_zero_divide(integer) line 12 at RAISE
  create function trap_matching_test(int) returns int as $$
  declare x int;
  	sx smallint;
*************** begin
*** 2066,2079 ****
  end$$ language plpgsql;
  select test_variable_storage();
  NOTICE:  should see this
- CONTEXT:  SQL statement "SELECT trap_zero_divide(-100)"
- PL/pgSQL function test_variable_storage() line 8 at PERFORM
  NOTICE:  should see this only if -100 <> 0
- CONTEXT:  SQL statement "SELECT trap_zero_divide(-100)"
- PL/pgSQL function test_variable_storage() line 8 at PERFORM
  NOTICE:  should see this only if -100 fits in smallint
- CONTEXT:  SQL statement "SELECT trap_zero_divide(-100)"
- PL/pgSQL function test_variable_storage() line 8 at PERFORM
   test_variable_storage 
  -----------------------
   123456789012
--- 2075,2082 ----
*************** DETAIL:  some detail info
*** 4052,4057 ****
--- 4055,4061 ----
  HINT:  some hint
  ERROR:  1 2 3
  DETAIL:  some detail info
+ CONTEXT:  PL/pgSQL function raise_test() line 5 at RAISE
  -- Since we can't actually see the thrown SQLSTATE in default psql output,
  -- test it like this; this also tests re-RAISE
  create or replace function raise_test() returns void as $$
*************** select raise_test();
*** 4068,4073 ****
--- 4072,4078 ----
  NOTICE:  SQLSTATE: 22012 SQLERRM: check me
  ERROR:  check me
  DETAIL:  some detail info
+ CONTEXT:  PL/pgSQL function raise_test() line 3 at RAISE
  create or replace function raise_test() returns void as $$
  begin
    raise 'check me'
*************** select raise_test();
*** 4082,4087 ****
--- 4087,4093 ----
  NOTICE:  SQLSTATE: 1234F SQLERRM: check me
  ERROR:  check me
  DETAIL:  some detail info
+ CONTEXT:  PL/pgSQL function raise_test() line 3 at RAISE
  -- SQLSTATE specification in WHEN
  create or replace function raise_test() returns void as $$
  begin
*************** select raise_test();
*** 4097,4102 ****
--- 4103,4109 ----
  NOTICE:  SQLSTATE: 1234F SQLERRM: check me
  ERROR:  check me
  DETAIL:  some detail info
+ CONTEXT:  PL/pgSQL function raise_test() line 3 at RAISE
  create or replace function raise_test() returns void as $$
  begin
    raise division_by_zero using detail = 'some detail info';
*************** select raise_test();
*** 4110,4115 ****
--- 4117,4123 ----
  NOTICE:  SQLSTATE: 22012 SQLERRM: division_by_zero
  ERROR:  division_by_zero
  DETAIL:  some detail info
+ CONTEXT:  PL/pgSQL function raise_test() line 3 at RAISE
  create or replace function raise_test() returns void as $$
  begin
    raise division_by_zero;
*************** end;
*** 4117,4122 ****
--- 4125,4131 ----
  $$ language plpgsql;
  select raise_test();
  ERROR:  division_by_zero
+ CONTEXT:  PL/pgSQL function raise_test() line 3 at RAISE
  create or replace function raise_test() returns void as $$
  begin
    raise sqlstate '1234F';
*************** end;
*** 4124,4129 ****
--- 4133,4139 ----
  $$ language plpgsql;
  select raise_test();
  ERROR:  1234F
+ CONTEXT:  PL/pgSQL function raise_test() line 3 at RAISE
  create or replace function raise_test() returns void as $$
  begin
    raise division_by_zero using message = 'custom' || ' message';
*************** end;
*** 4131,4136 ****
--- 4141,4147 ----
  $$ language plpgsql;
  select raise_test();
  ERROR:  custom message
+ CONTEXT:  PL/pgSQL function raise_test() line 3 at RAISE
  create or replace function raise_test() returns void as $$
  begin
    raise using message = 'custom' || ' message', errcode = '22012';
*************** end;
*** 4138,4143 ****
--- 4149,4155 ----
  $$ language plpgsql;
  select raise_test();
  ERROR:  custom message
+ CONTEXT:  PL/pgSQL function raise_test() line 3 at RAISE
  -- conflict on message
  create or replace function raise_test() returns void as $$
  begin
*************** $$ language plpgsql;
*** 4254,4259 ****
--- 4266,4272 ----
  select raise_test();
  NOTICE:  22012
  ERROR:  substitute message
+ CONTEXT:  PL/pgSQL function raise_test() line 7 at RAISE
  drop function raise_test();
  -- test passing column_name, constraint_name, datatype_name, table_name
  -- and schema_name error fields
*************** LINE 1: SELECT 'foo\\bar\041baz'
*** 4744,4750 ****
                 ^
  HINT:  Use the escape string syntax for backslashes, e.g., E'\\'.
  QUERY:  SELECT 'foo\\bar\041baz'
- CONTEXT:  PL/pgSQL function strtest() line 4 at RETURN
     strtest   
  -------------
   foo\bar!baz
--- 4757,4762 ----
*************** $$ language plpgsql;
*** 5260,5281 ****
  select outer_outer_func(10);
  NOTICE:  calling down into outer_func()
  NOTICE:  calling down into inner_func()
- CONTEXT:  PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  ***PL/pgSQL function inner_func(integer) line 4 at GET DIAGNOSTICS
  PL/pgSQL function outer_func(integer) line 6 at assignment
  PL/pgSQL function outer_outer_func(integer) line 6 at assignment***
- CONTEXT:  PL/pgSQL function outer_func(integer) line 6 at assignment
- PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  ***PL/pgSQL function inner_func(integer) line 7 at GET DIAGNOSTICS
  PL/pgSQL function outer_func(integer) line 6 at assignment
  PL/pgSQL function outer_outer_func(integer) line 6 at assignment***
- CONTEXT:  PL/pgSQL function outer_func(integer) line 6 at assignment
- PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  lets make sure we didnt break anything
- CONTEXT:  PL/pgSQL function outer_func(integer) line 6 at assignment
- PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  inner_func() done
- CONTEXT:  PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  outer_func() done
   outer_outer_func 
  ------------------
--- 5272,5285 ----
*************** NOTICE:  outer_func() done
*** 5286,5307 ****
  select outer_outer_func(20);
  NOTICE:  calling down into outer_func()
  NOTICE:  calling down into inner_func()
- CONTEXT:  PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  ***PL/pgSQL function inner_func(integer) line 4 at GET DIAGNOSTICS
  PL/pgSQL function outer_func(integer) line 6 at assignment
  PL/pgSQL function outer_outer_func(integer) line 6 at assignment***
- CONTEXT:  PL/pgSQL function outer_func(integer) line 6 at assignment
- PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  ***PL/pgSQL function inner_func(integer) line 7 at GET DIAGNOSTICS
  PL/pgSQL function outer_func(integer) line 6 at assignment
  PL/pgSQL function outer_outer_func(integer) line 6 at assignment***
- CONTEXT:  PL/pgSQL function outer_func(integer) line 6 at assignment
- PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  lets make sure we didnt break anything
- CONTEXT:  PL/pgSQL function outer_func(integer) line 6 at assignment
- PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  inner_func() done
- CONTEXT:  PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  outer_func() done
   outer_outer_func 
  ------------------
--- 5290,5303 ----
*************** $$ language plpgsql;
*** 5358,5379 ****
  select outer_outer_func(10);
  NOTICE:  calling down into outer_func()
  NOTICE:  calling down into inner_func()
- CONTEXT:  PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  ***PL/pgSQL function inner_func(integer) line 10 at GET DIAGNOSTICS
  PL/pgSQL function outer_func(integer) line 6 at assignment
  PL/pgSQL function outer_outer_func(integer) line 6 at assignment***
- CONTEXT:  PL/pgSQL function outer_func(integer) line 6 at assignment
- PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  ***PL/pgSQL function inner_func(integer) line 15 at GET DIAGNOSTICS
  PL/pgSQL function outer_func(integer) line 6 at assignment
  PL/pgSQL function outer_outer_func(integer) line 6 at assignment***
- CONTEXT:  PL/pgSQL function outer_func(integer) line 6 at assignment
- PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  lets make sure we didnt break anything
- CONTEXT:  PL/pgSQL function outer_func(integer) line 6 at assignment
- PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  inner_func() done
- CONTEXT:  PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  outer_func() done
   outer_outer_func 
  ------------------
--- 5354,5367 ----
*************** NOTICE:  outer_func() done
*** 5384,5405 ****
  select outer_outer_func(20);
  NOTICE:  calling down into outer_func()
  NOTICE:  calling down into inner_func()
- CONTEXT:  PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  ***PL/pgSQL function inner_func(integer) line 10 at GET DIAGNOSTICS
  PL/pgSQL function outer_func(integer) line 6 at assignment
  PL/pgSQL function outer_outer_func(integer) line 6 at assignment***
- CONTEXT:  PL/pgSQL function outer_func(integer) line 6 at assignment
- PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  ***PL/pgSQL function inner_func(integer) line 15 at GET DIAGNOSTICS
  PL/pgSQL function outer_func(integer) line 6 at assignment
  PL/pgSQL function outer_outer_func(integer) line 6 at assignment***
- CONTEXT:  PL/pgSQL function outer_func(integer) line 6 at assignment
- PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  lets make sure we didnt break anything
- CONTEXT:  PL/pgSQL function outer_func(integer) line 6 at assignment
- PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  inner_func() done
- CONTEXT:  PL/pgSQL function outer_outer_func(integer) line 6 at assignment
  NOTICE:  outer_func() done
   outer_outer_func 
  ------------------
--- 5372,5385 ----
diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out
new file mode 100644
index c0cd9fa..88bdc2c
*** a/src/test/regress/expected/privileges.out
--- b/src/test/regress/expected/privileges.out
*************** GRANT regressgroup2 TO regressuser5; --
*** 1023,1029 ****
  ERROR:  must have admin option on role "regressgroup2"
  SELECT dogrant_ok();			-- ok: SECURITY DEFINER conveys ADMIN
  NOTICE:  role "regressuser5" is already a member of role "regressgroup2"
- CONTEXT:  SQL function "dogrant_ok" statement 1
   dogrant_ok 
  ------------
   
--- 1023,1028 ----
diff --git a/src/test/regress/expected/rangefuncs.out b/src/test/regress/expected/rangefuncs.out
new file mode 100644
index 6dabe50..00ef421
*** a/src/test/regress/expected/rangefuncs.out
--- b/src/test/regress/expected/rangefuncs.out
*************** create trigger tnoticetrigger after inse
*** 1704,1712 ****
  execute procedure noticetrigger();
  select insert_tt2('foolme','barme') limit 1;
  NOTICE:  noticetrigger 11 foolme
- CONTEXT:  SQL function "insert_tt2" statement 1
  NOTICE:  noticetrigger 12 barme
- CONTEXT:  SQL function "insert_tt2" statement 1
   insert_tt2 
  ------------
           11
--- 1704,1710 ----
*************** create rule insert_tt_rule as on insert
*** 1735,1743 ****
    insert into tt_log values(new.*);
  select insert_tt2('foollog','barlog') limit 1;
  NOTICE:  noticetrigger 13 foollog
- CONTEXT:  SQL function "insert_tt2" statement 1
  NOTICE:  noticetrigger 14 barlog
- CONTEXT:  SQL function "insert_tt2" statement 1
   insert_tt2 
  ------------
           13
--- 1733,1739 ----
diff --git a/src/test/regress/expected/triggers.out b/src/test/regress/expected/triggers.out
new file mode 100644
index 3b32e8f..cd43e46
*** a/src/test/regress/expected/triggers.out
--- b/src/test/regress/expected/triggers.out
*************** NOTICE:  main_view BEFORE INSERT STATEME
*** 958,968 ****
  NOTICE:  main_view INSTEAD OF INSERT ROW (instead_of_ins)
  NOTICE:  NEW: (20,30)
  NOTICE:  trigger_func(before_ins_stmt) called: action = INSERT, when = BEFORE, level = STATEMENT
- CONTEXT:  SQL statement "INSERT INTO main_table VALUES (NEW.a, NEW.b)"
- PL/pgSQL function view_trigger() line 17 at SQL statement
  NOTICE:  trigger_func(after_ins_stmt) called: action = INSERT, when = AFTER, level = STATEMENT
- CONTEXT:  SQL statement "INSERT INTO main_table VALUES (NEW.a, NEW.b)"
- PL/pgSQL function view_trigger() line 17 at SQL statement
  NOTICE:  main_view AFTER INSERT STATEMENT (after_view_ins_stmt)
  INSERT 0 1
  INSERT INTO main_view VALUES (21, 31) RETURNING a, b;
--- 958,964 ----
*************** NOTICE:  main_view BEFORE INSERT STATEME
*** 970,980 ****
  NOTICE:  main_view INSTEAD OF INSERT ROW (instead_of_ins)
  NOTICE:  NEW: (21,31)
  NOTICE:  trigger_func(before_ins_stmt) called: action = INSERT, when = BEFORE, level = STATEMENT
- CONTEXT:  SQL statement "INSERT INTO main_table VALUES (NEW.a, NEW.b)"
- PL/pgSQL function view_trigger() line 17 at SQL statement
  NOTICE:  trigger_func(after_ins_stmt) called: action = INSERT, when = AFTER, level = STATEMENT
- CONTEXT:  SQL statement "INSERT INTO main_table VALUES (NEW.a, NEW.b)"
- PL/pgSQL function view_trigger() line 17 at SQL statement
  NOTICE:  main_view AFTER INSERT STATEMENT (after_view_ins_stmt)
   a  | b  
  ----+----
--- 966,972 ----
*************** NOTICE:  main_view BEFORE UPDATE STATEME
*** 988,1004 ****
  NOTICE:  main_view INSTEAD OF UPDATE ROW (instead_of_upd)
  NOTICE:  OLD: (20,30), NEW: (20,31)
  NOTICE:  trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  trigger_func(before_upd_a_row) called: action = UPDATE, when = BEFORE, level = ROW
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  main_view AFTER UPDATE STATEMENT (after_view_upd_stmt)
  UPDATE 0
  UPDATE main_view SET b = 32 WHERE a = 21 AND b = 31 RETURNING a, b;
--- 980,988 ----
*************** NOTICE:  main_view BEFORE UPDATE STATEME
*** 1006,1022 ****
  NOTICE:  main_view INSTEAD OF UPDATE ROW (instead_of_upd)
  NOTICE:  OLD: (21,31), NEW: (21,32)
  NOTICE:  trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  trigger_func(before_upd_a_row) called: action = UPDATE, when = BEFORE, level = ROW
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  main_view AFTER UPDATE STATEMENT (after_view_upd_stmt)
   a | b 
  ---+---
--- 990,998 ----
*************** NOTICE:  main_view BEFORE UPDATE STATEME
*** 1031,1050 ****
  NOTICE:  main_view INSTEAD OF UPDATE ROW (instead_of_upd)
  NOTICE:  OLD: (20,30), NEW: (20,31)
  NOTICE:  trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  main_view AFTER UPDATE STATEMENT (after_view_upd_stmt)
  UPDATE 1
  UPDATE main_view SET b = 32 WHERE a = 21 AND b = 31 RETURNING a, b;
--- 1007,1016 ----
*************** NOTICE:  main_view BEFORE UPDATE STATEME
*** 1052,1071 ****
  NOTICE:  main_view INSTEAD OF UPDATE ROW (instead_of_upd)
  NOTICE:  OLD: (21,31), NEW: (21,32)
  NOTICE:  trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT
- CONTEXT:  SQL statement "UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b"
- PL/pgSQL function view_trigger() line 23 at SQL statement
  NOTICE:  main_view AFTER UPDATE STATEMENT (after_view_upd_stmt)
   a  | b  
  ----+----
--- 1018,1027 ----
*************** INSERT 0 1
*** 1277,1282 ****
--- 1233,1239 ----
  -- UPDATE .. RETURNING
  UPDATE city_view SET country_name = 'Japon' WHERE city_name = 'Tokyo'; -- error
  ERROR:  No such country: "Japon"
+ CONTEXT:  PL/pgSQL function city_update() line 9 at RAISE
  UPDATE city_view SET country_name = 'Japan' WHERE city_name = 'Takyo'; -- no match
  UPDATE 0
  UPDATE city_view SET country_name = 'Japan' WHERE city_name = 'Tokyo' RETURNING *; -- OK
*************** select pg_trigger_depth();
*** 1489,1514 ****
  insert into depth_a values (1);
  NOTICE:  depth_a_tr: depth = 1
  NOTICE:  depth_b_tr: depth = 2
- CONTEXT:  SQL statement "insert into depth_b values (new.id)"
- PL/pgSQL function depth_a_tf() line 4 at SQL statement
  NOTICE:  depth_c_tr: depth = 3
- CONTEXT:  SQL statement "insert into depth_c values (1)"
- PL/pgSQL function depth_b_tf() line 5 at EXECUTE statement
- SQL statement "insert into depth_b values (new.id)"
- PL/pgSQL function depth_a_tf() line 4 at SQL statement
  NOTICE:  SQLSTATE = U9999: depth = 2
- CONTEXT:  SQL statement "insert into depth_b values (new.id)"
- PL/pgSQL function depth_a_tf() line 4 at SQL statement
  NOTICE:  depth_b_tr: depth = 2
- CONTEXT:  SQL statement "insert into depth_b values (new.id)"
- PL/pgSQL function depth_a_tf() line 4 at SQL statement
  NOTICE:  depth_c_tr: depth = 3
- CONTEXT:  SQL statement "insert into depth_c values (1)"
- PL/pgSQL function depth_b_tf() line 12 at EXECUTE statement
- SQL statement "insert into depth_b values (new.id)"
- PL/pgSQL function depth_a_tf() line 4 at SQL statement
  ERROR:  U9999
! CONTEXT:  SQL statement "insert into depth_c values (1)"
  PL/pgSQL function depth_b_tf() line 12 at EXECUTE statement
  SQL statement "insert into depth_b values (new.id)"
  PL/pgSQL function depth_a_tf() line 4 at SQL statement
--- 1446,1458 ----
  insert into depth_a values (1);
  NOTICE:  depth_a_tr: depth = 1
  NOTICE:  depth_b_tr: depth = 2
  NOTICE:  depth_c_tr: depth = 3
  NOTICE:  SQLSTATE = U9999: depth = 2
  NOTICE:  depth_b_tr: depth = 2
  NOTICE:  depth_c_tr: depth = 3
  ERROR:  U9999
! CONTEXT:  PL/pgSQL function depth_c_tf() line 5 at RAISE
! SQL statement "insert into depth_c values (1)"
  PL/pgSQL function depth_b_tf() line 12 at EXECUTE statement
  SQL statement "insert into depth_b values (new.id)"
  PL/pgSQL function depth_a_tf() line 4 at SQL statement
*************** select pg_trigger_depth();
*** 1521,1541 ****
  insert into depth_a values (2);
  NOTICE:  depth_a_tr: depth = 1
  NOTICE:  depth_b_tr: depth = 2
- CONTEXT:  SQL statement "insert into depth_b values (new.id)"
- PL/pgSQL function depth_a_tf() line 4 at SQL statement
  NOTICE:  depth_c_tr: depth = 3
- CONTEXT:  SQL statement "insert into depth_c values (2)"
- PL/pgSQL function depth_b_tf() line 5 at EXECUTE statement
- SQL statement "insert into depth_b values (new.id)"
- PL/pgSQL function depth_a_tf() line 4 at SQL statement
  NOTICE:  depth_c_tr: depth = 3
- CONTEXT:  SQL statement "insert into depth_c values (2)"
- PL/pgSQL function depth_b_tf() line 5 at EXECUTE statement
- SQL statement "insert into depth_b values (new.id)"
- PL/pgSQL function depth_a_tf() line 4 at SQL statement
  NOTICE:  depth_b_tr: depth = 2
- CONTEXT:  SQL statement "insert into depth_b values (new.id)"
- PL/pgSQL function depth_a_tf() line 4 at SQL statement
  NOTICE:  depth_a_tr: depth = 1
  select pg_trigger_depth();
   pg_trigger_depth 
--- 1465,1473 ----
diff --git a/src/test/regress/expected/xml.out b/src/test/regress/expected/xml.out
new file mode 100644
index 9b2d264..5691e47
*** a/src/test/regress/expected/xml.out
--- b/src/test/regress/expected/xml.out
*************** SELECT xpath('/*', '<relativens xmlns=''
*** 934,940 ****
  WARNING:  line 1: xmlns: URI relative is not absolute
  <relativens xmlns='relative'/>
                              ^
- CONTEXT:  SQL function "xpath" statement 1
                  xpath                 
  --------------------------------------
   {"<relativens xmlns=\"relative\"/>"}
--- 934,939 ----
-- 
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