Skip site navigation (1) Skip section navigation (2)

psql filename completion: quoting

From: Noah Misch <noah(at)leadboat(dot)com>
To: pgsql-hackers(at)postgresql(dot)org
Subject: psql filename completion: quoting
Date: 2012-01-14 15:20:18
Message-ID: 20120114152018.GA12188@tornado.leadboat.com (view raw or flat)
Thread:
Lists: pgsql-hackers
Occasionally, I have a SQL file destined for psql's \i command whose name
contains a space.  Less often, I'll have a .csv destined for \copy with the
same problem.  psql's filename completion does not handle these well.  It
completes on the literal name, but the commands will only recognize quoted
names.  For example, given a file "foo bar", "\i f<TAB>" will complete to "\i
foo bar", which will not execute.  If I type "\i 'f<TAB>", completion will not
help at all.

The attached patch wraps rl_filename_completion_function() to dequote on input
and enquote on output.  Now, "\i f<TAB>" and "\i 'f<TAB>" will both complete
to "\i 'foo bar'", which executes as expected.  The new code handles embedded
whitespace, quotes, and backslashes.

tab-complete.c works in terms of whitespace-separated words.  As such, "\i
'foo b<TAB>" does not complete, because tab-complete.c has no notion of quotes
affecting token boundaries.  It thinks "'foo" is one token and "b" is another.
I'm sure we could fix this (Bash gets it right).  It seemed rather independent
code-wise, so I did not attempt that for this patch.

Thanks,
nm

Responses

pgsql-hackers by date

Next:From: Noah MischDate: 2012-01-14 15:40:02
Subject: psql COPY vs. ON_ERROR_ROLLBACK, multi-command strings
Previous:From: Robert HaasDate: 2012-01-14 15:02:34
Subject: Re: Command Triggers

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group