Re: pg_service.conf ignores dbname parameter - Mailing list pgsql-bugs

From Bruce Momjian
Subject Re: pg_service.conf ignores dbname parameter
Date
Msg-id 200312192150.hBJLoVq07836@candle.pha.pa.us
Whole thread Raw
In response to pg_service.conf ignores dbname parameter  (Michael Fuhr <mfuhr@fuhr.org>)
Responses Re: pg_service.conf ignores dbname parameter  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-bugs
I have applied the attached patch to remove the default
dbname=serive-name code, changed the comment at the top of the file, and
changed a few ints to booleans.

---------------------------------------------------------------------------

Michael Fuhr wrote:
> ============================================================================
>                         POSTGRESQL BUG REPORT TEMPLATE
> ============================================================================
>
> Your name        : Michael Fuhr
> Your email address    : mfuhr@fuhr.org
>
>
> System Configuration
> ---------------------
>   Architecture (example: Intel Pentium)      : several
>
>   Operating System (example: Linux 2.0.26 ELF)     : several
>
>   PostgreSQL version (example: PostgreSQL-7.4):   PostgreSQL-7.4
>
>   Compiler used (example:  gcc 2.95.2)        : several
>
>
> Please enter a FULL description of your problem:
> ------------------------------------------------
>
> When a client connects to the database server using a service name,
> the dbname parameter in pg_service.conf is ignored.  In the absence
> of an explicitly-named database in the connection string, the service
> name is used as the database name regardless of that service's
> dbname setting.
>
>
> Please describe a way to repeat the problem.   Please try to provide a
> concise reproducible example, if at all possible:
> ----------------------------------------------------------------------
>
> 1. Create/edit pg_service.conf in whatever directory it's supposed
> to be in on your system (location varies).  Add the following (change
> the database and user names as appropriate for your system):
>
> [foobar]
> dbname=template1
> user=postgres
>
> 2. Connect to the database server using the "foobar" service.  The
> following example should work on most Unix-like systems (you may
> or may not be prompted for a password, depending on your configuration):
>
> % env PGSERVICE=foobar psql
> Password: ********
> psql: FATAL:  database "foobar" does not exist
>
>
> If you know how this problem might be fixed, list the solution below:
> ---------------------------------------------------------------------
>
> The problem appears to be in the parseServiceInfo() function in
> src/interfaces/libpq/fe-connect.c.  Here's an excerpt from that
> function:
>
>         /*
>          * If not already set, set the database name to the
>          * name of the service
>          */
>         for (i = 0; options[i].keyword; i++)
>         {
>             if (strcmp(options[i].keyword, "dbname") == 0)
>             {
>                 if (options[i].val == NULL)
>                     options[i].val = strdup(service);
>                 break;
>             }
>         }
>
>         /*
>          * Set the parameter --- but don't override any
>          * previous explicit setting.
>          */
>         found_keyword = 0;
>         for (i = 0; options[i].keyword; i++)
>         {
>             if (strcmp(options[i].keyword, key) == 0)
>             {
>                 if (options[i].val == NULL)
>                     options[i].val = strdup(val);
>                 found_keyword = 1;
>                 break;
>             }
>         }
>
> Since the database name is already set to be either the service
> name or an explicitly named database from the connection string,
> the "Set the parameter" section of code skips the dbname parameter.
> I haven't yet examined the rest of the code closely enough to come
> up with the correct patch, but it seems that the "set the database
> name to the name of the service" code should be deferred until
> after all of the service's parameters have been read.
>
> --
> Michael Fuhr
>
> ---------------------------(end of broadcast)---------------------------
> TIP 8: explain analyze is your friend
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/interfaces/libpq/fe-connect.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/fe-connect.c,v
retrieving revision 1.264
diff -c -c -r1.264 fe-connect.c
*** src/interfaces/libpq/fe-connect.c    29 Nov 2003 19:52:11 -0000    1.264
--- src/interfaces/libpq/fe-connect.c    19 Dec 2003 21:18:13 -0000
***************
*** 2367,2373 ****
  {
      char       *service = conninfo_getval(options, "service");
      char       *serviceFile = SYSCONFDIR "/pg_service.conf";
!     int            group_found = 0;
      int            linenr = 0,
                  i;

--- 2367,2373 ----
  {
      char       *service = conninfo_getval(options, "service");
      char       *serviceFile = SYSCONFDIR "/pg_service.conf";
!     bool        group_found = false;
      int            linenr = 0,
                  i;

***************
*** 2431,2439 ****

                  if (strncmp(line + 1, service, strlen(service)) == 0 &&
                      line[strlen(service) + 1] == ']')
!                     group_found = 1;
                  else
!                     group_found = 0;
              }
              else
              {
--- 2431,2439 ----

                  if (strncmp(line + 1, service, strlen(service)) == 0 &&
                      line[strlen(service) + 1] == ']')
!                     group_found = true;
                  else
!                     group_found = false;
              }
              else
              {
***************
*** 2445,2451 ****
                       */
                      char       *key,
                                 *val;
!                     int            found_keyword;

                      key = line;
                      val = strchr(line, '=');
--- 2445,2451 ----
                       */
                      char       *key,
                                 *val;
!                     bool        found_keyword;

                      key = line;
                      val = strchr(line, '=');
***************
*** 2461,2491 ****
                      *val++ = '\0';

                      /*
-                      * If not already set, set the database name to the
-                      * name of the service
-                      */
-                     for (i = 0; options[i].keyword; i++)
-                     {
-                         if (strcmp(options[i].keyword, "dbname") == 0)
-                         {
-                             if (options[i].val == NULL)
-                                 options[i].val = strdup(service);
-                             break;
-                         }
-                     }
-
-                     /*
                       * Set the parameter --- but don't override any
                       * previous explicit setting.
                       */
!                     found_keyword = 0;
                      for (i = 0; options[i].keyword; i++)
                      {
                          if (strcmp(options[i].keyword, key) == 0)
                          {
                              if (options[i].val == NULL)
                                  options[i].val = strdup(val);
!                             found_keyword = 1;
                              break;
                          }
                      }
--- 2461,2477 ----
                      *val++ = '\0';

                      /*
                       * Set the parameter --- but don't override any
                       * previous explicit setting.
                       */
!                     found_keyword = false;
                      for (i = 0; options[i].keyword; i++)
                      {
                          if (strcmp(options[i].keyword, key) == 0)
                          {
                              if (options[i].val == NULL)
                                  options[i].val = strdup(val);
!                             found_keyword = true;
                              break;
                          }
                      }
Index: src/interfaces/libpq/pg_service.conf.sample
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/pg_service.conf.sample,v
retrieving revision 1.1
diff -c -c -r1.1 pg_service.conf.sample
*** src/interfaces/libpq/pg_service.conf.sample    3 Feb 2003 14:24:07 -0000    1.1
--- src/interfaces/libpq/pg_service.conf.sample    19 Dec 2003 21:18:13 -0000
***************
*** 5,16 ****
  # multiple services in this file.  Each starts with a service name in
  # brackets.  Subsequent lines have connection configuration parameters of
  # the pattern  "param=value".  A sample configuration for template1 is
! # included in this file.  If no database name is specified, it is assumed
! # to match the service name.  Lines beginning with '#' are comments.
  #
  # Copy this to your sysconf directory (typically /usr/local/pgsql/etc) and
  # rename it pg_service.conf.
  #
  #
  #[template1]
  #user=postgres
--- 5,16 ----
  # multiple services in this file.  Each starts with a service name in
  # brackets.  Subsequent lines have connection configuration parameters of
  # the pattern  "param=value".  A sample configuration for template1 is
! # included in this file.  Lines beginning with '#' are comments.
  #
  # Copy this to your sysconf directory (typically /usr/local/pgsql/etc) and
  # rename it pg_service.conf.
  #
  #
  #[template1]
+ #dbname=template1
  #user=postgres

pgsql-bugs by date:

Previous
From: Lamar Owen
Date:
Subject: Re: Jdbc connection pooling and PG 7.4 consistently fails
Next
From: "PostgreSQL Bugs List"
Date:
Subject: BUG #1022: date calculation forces wrong type in function parameter and causes error