pg_service.conf ignores dbname parameter - Mailing list pgsql-bugs
From | Michael Fuhr |
---|---|
Subject | pg_service.conf ignores dbname parameter |
Date | |
Msg-id | 20031216035911.GA10756@winnie.fuhr.org Whole thread Raw |
Responses |
Re: pg_service.conf ignores dbname parameter
(Tom Lane <tgl@sss.pgh.pa.us>)
Re: pg_service.conf ignores dbname parameter (Bruce Momjian <pgman@candle.pha.pa.us>) |
List | pgsql-bugs |
============================================================================ 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
pgsql-bugs by date: