Lists: | pgsql-bugs |
---|
From: | "Paul Deschamps" <pdescham49(at)gmail(dot)com> |
---|---|
To: | pgsql-bugs(at)postgresql(dot)org |
Subject: | BUG #5978: Running postgress in a shell script fails |
Date: | 2011-04-13 18:15:31 |
Message-ID: | 201104131815.p3DIFV3N065457@wwwmaster.postgresql.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-bugs |
The following bug has been logged online:
Bug reference: 5978
Logged by: Paul Deschamps
Email address: pdescham49(at)gmail(dot)com
PostgreSQL version: 8.4.6
Operating system: Ubuntu 10.4
Description: Running postgress in a shell script fails
Details:
When running postgres in a shell using the -c option it looks as though it
parses the contents of the --command as command line arguments.
---BEGIN SCRIPT---
#!/bin/bash
psql --version
PCOMMAND='psql postgres -c"SELECT tablename FROM PG_TABLES limit 1;"'
echo "PGSQL - Execution from a shell script test"
echo
echo "Running Command:"${PCOMMAND}
echo "TEST 1 "
OUTPUT1=$(${PCOMMAND})
echo $OUTPUT1
echo
echo "TEST 2"
OUTPUT2=`$PCOMMAND`
echo $OUTPUT2
echo
echo "TEST 3"
OUTPUT3=`exec $PCOMMAND`
echo $OUTPUT3
echo
echo "TEST 4"
$PCOMMAND
echo "TEST 5"
psql postgres -c"SELECT tablename FROM PG_TABLES limit 1;"
---END SCRIPT---
---BEGIN OUTPUT---
[postgres(at)host03 scripts]$ ./test.sh
psql (PostgreSQL) 8.4.6
PGSQL - Execution from a shell script test
Running Command:psql postgres -c"SELECT tablename FROM PG_TABLES limit 1;"
TEST 1
psql: warning: extra command-line argument "FROM" ignored
psql: warning: extra command-line argument "PG_TABLES" ignored
psql: warning: extra command-line argument "limit" ignored
psql: warning: extra command-line argument "1;"" ignored
psql: FATAL: role "tablename" does not exist
TEST 2
psql: warning: extra command-line argument "FROM" ignored
psql: warning: extra command-line argument "PG_TABLES" ignored
psql: warning: extra command-line argument "limit" ignored
psql: warning: extra command-line argument "1;"" ignored
psql: FATAL: role "tablename" does not exist
TEST 3
psql: warning: extra command-line argument "FROM" ignored
psql: warning: extra command-line argument "PG_TABLES" ignored
psql: warning: extra command-line argument "limit" ignored
psql: warning: extra command-line argument "1;"" ignored
psql: FATAL: role "tablename" does not exist
TEST 4
psql: warning: extra command-line argument "FROM" ignored
psql: warning: extra command-line argument "PG_TABLES" ignored
psql: warning: extra command-line argument "limit" ignored
psql: warning: extra command-line argument "1;"" ignored
psql: FATAL: role "tablename" does not exist
TEST 5
tablename
-----------
pg_type
(1 row)
---END OUTPUT---
From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | "Paul Deschamps" <pdescham49(at)gmail(dot)com> |
Cc: | pgsql-bugs(at)postgresql(dot)org |
Subject: | Re: BUG #5978: Running postgress in a shell script fails |
Date: | 2011-04-13 21:50:16 |
Message-ID: | 25680.1302731416@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-bugs |
"Paul Deschamps" <pdescham49(at)gmail(dot)com> writes:
> PostgreSQL version: 8.4.6
> Operating system: Ubuntu 10.4
> Description: Running postgress in a shell script fails
> Details:
> When running postgres in a shell using the -c option it looks as though it
> parses the contents of the --command as command line arguments.
> Running Command:psql postgres -c"SELECT tablename FROM PG_TABLES limit 1;"
> TEST 1
> psql: warning: extra command-line argument "FROM" ignored
> psql: warning: extra command-line argument "PG_TABLES" ignored
> psql: warning: extra command-line argument "limit" ignored
> psql: warning: extra command-line argument "1;"" ignored
> psql: FATAL: role "tablename" does not exist
I think this is a bug in Ubuntu's version of getopt_long(); it does not
happen that way for me on any of the platforms I use. I get either
psql: FATAL: role "-cSELECT tablename FROM PG_TABLES limit 1;" does not exist
on platforms where getopt_long does not think it has a charter to try to
rearrange command line arguments, or
$ psql postgres -c"SELECT tablename FROM PG_TABLES limit 1;"
tablename
--------------
pg_statistic
(1 row)
on platforms where getopt_long does move the database name after the
switch+argument. What you've evidently got is a getopt_long that tries
to rearrange the command-line arguments but produces the equivalent of
psql "-cSELECT" "postgres" "tablename" "FROM" "PG_TABLES" "limit" "1;"
which is flat out wrong.
Recommendation is to use the documented command line order, which is
psql [OPTION]... [DBNAME [USERNAME]]
rather than assuming getopt_long will fix it for you.
You can try filing a bug against Ubuntu's glibc, but I dunno whether
you'll get any satisfaction there. I think we've heard of this before
and the misbehavior is of long standing.
regards, tom lane