fetch_search_path() and elog.c - Mailing list pgsql-hackers

From Ferruccio Zamuner
Subject fetch_search_path() and elog.c
Date
Msg-id 42D22581.6030409@diff.org
Whole thread Raw
Responses Re: fetch_search_path() and elog.c
List pgsql-hackers
Hi,

I need to have in the log_line_prefix the search_path where the query 
has run.
So last week I've started to read elog.c and I was thinking about a 
small patch there using a new "%S" option.

First I've introduced a small code:     case 'S':       {           List *search_path = fetch_search_path(false);
   if (search_path != NIL) {               ListCell   *l;               foreach(l, search_path)                  {
               char       *nspname;
 
                      nspname = get_namespace_name(lfirst_oid(l));                      if (nspname)
/*watch out for 
 
deleted namespace */                          {                               appendStringInfo(buf, "%s ", nspname);
                          pfree(nspname);                         }                 }
list_free(search_path);          }           break;       }
 

but in this way postgres was starting with a core dump writing on log.

Then I've add some code, and now it starts but it kills the postgres 
process as soon as a query has sent to log:

$ diff -u elog.c elog_new.c
--- elog.c      Sat Mar 12 02:55:15 2005
+++ elog_new.c  Sun Jul 10 10:16:35 2005
@@ -67,7 +67,8 @@#include "tcop/tcopprot.h"#include "utils/memutils.h"#include "utils/guc.h"
-
+#include "catalog/namespace.h"
+#include "catalog/pg_type.h"
/* Global variables */ErrorContextCallback *error_context_stack = NULL;
@@ -1444,6 +1445,32 @@                       case '%':                               appendStringInfoChar(buf, '%');
                          break;
 
+                               /* */
+                       case 'S':
+                               /* estrae il search_path */
+                         if (MyProcPort && (MyProcPort->commandTag != 
NULL)) {
+                           char *cmd=MyProcPort->commandTag;
+                           if ((strcasecmp(cmd,"SELECT")== 0) || 
(strcasecmp(cmd,"INSERT")== 0) || (strcasecmp(cmd,"UPDATE")== 0) || 
(strcasecmp(cmd,"DELETE")== 0)) {
+                            
+                           }
+                         }
+                         break;
+List *search_path = fetch_search_path(false);
+                             if (search_path != NIL) {
+                               ListCell   *l;
+                               foreach(l, search_path)
+                                 {
+                                   char       *nspname;
+
+                                   nspname = 
get_namespace_name(lfirst_oid(l));
+                                   if (nspname)                    /* 
watch out for deleted namespace */
+                                     {
+                                       appendStringInfo(buf, "%s ", 
nspname);
+                                       pfree(nspname);
+                                     }
+                                 }
+                               list_free(search_path);
+                             }                       default:                               /* format error - ignore
it*/                               break;
 

And here there is the client output:

bash-2.05a$ psql prova -U pgsql
Welcome to psql 8.0.3, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms      \h for help with SQL commands      \? for help with psql commands      \g
orterminate with semicolon to execute query      \q to quit
 

prova=# select * from prova;
server closed the connection unexpectedly       This probably means the server terminated abnormally       before or
whileprocessing the request.
 
The connection to the server was lost. Attempting reset: Failed.
!>

Where can I start to understand which checks I've missed and how to gain 
the output I need?


Thank you in advance,                \ferz
---
NonSoLoSoft - http://www.nonsolosoft.com/


pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Fixing domain input
Next
From: Simon Riggs
Date:
Subject: Re: Checkpoint cost, looks like it is WAL/CRC