From: | Michael Fuhr <mfuhr(at)fuhr(dot)org> |
---|---|
To: | pgsql-bugs(at)postgresql(dot)org |
Subject: | pg_service.conf ignores dbname parameter |
Date: | 2003-12-16 03:59:11 |
Message-ID: | 20031216035911.GA10756@winnie.fuhr.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs pgsql-hackers |
============================================================================
POSTGRESQL BUG REPORT TEMPLATE
============================================================================
Your name : Michael Fuhr
Your email address : mfuhr(at)fuhr(dot)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
From | Date | Subject | |
---|---|---|---|
Next Message | Peter Eisentraut | 2003-12-16 14:59:29 | Re: BUG #1006: information schema constraint information. |
Previous Message | Tom Lane | 2003-12-16 00:10:22 | Re: BUG #1008: fe-misc.c has an ifdef for HAVE_POLL, should be HAVE_POLL_H |
From | Date | Subject | |
---|---|---|---|
Next Message | Christopher Kings-Lynne | 2003-12-16 04:05:25 | Oddness 7.3 vs 7.4 |
Previous Message | Tatsuo Ishii | 2003-12-16 03:56:42 | time zone? |